rm
rekursi hanya berfungsi dengan benar?
rm -r x y
akan menghapus x
dan y
semua yang ada di dalamnya (jika itu adalah direktori), tetapi bukan orang tua mereka atau apa pun di luar mereka.
Menjalankan: sudo rm -R *.QTFS
akan menghapus semua file * .QTFS di direktori saat ini dan anak-anaknya, benar?
Tidak. Ini akan menghapus semua file yang diberi nama *.QTFS
, file apa pun secara rekursif di dalam direktori yang disebut *.QTFS
, dan direktori itu sendiri. Jika Anda menginginkan perilaku penghapusan lainnya, gunakan find -delete
.
direktori saat ini seperti yang ditampilkan oleh ls -lha
juga berisi .
dan ..
tautan karena tidak ada kata yang lebih baik, jadi mengapa rekursi tidak mengikuti ini di pohon direktori? Apakah ada batasan buatan pada aplikasi rm, atau .
dan ..
bukan hal-hal nyata?
Ini batas buatan rm
.
Ini tidak sepenuhnya buatan, meskipun - itu satu-satunya cara yang bisa berhasil. Jika rm
mengikuti ..
tautan induk , setiap orang rm -r
akan menghapus setiap file di sistem, dengan mengikuti semua ..
tautan kembali ke /
. rm
melihat ..
dan .
entri di setiap direktori ketika daftar konten, dan secara eksplisit mengabaikannya karena alasan itu.
Anda bisa mencobanya sendiri. Jalankan rm -r .
dan sebagian besar rm
implementasi akan menolak untuk bertindak, melaporkan kesalahan secara eksplisit:
$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
(pesan itu dari GNUrm
; yang lain serupa). Ketika bertemu entri ini secara implisit, bukan sebagai argumen eksplisit, itu hanya mengabaikan mereka dan melanjutkan. Perilaku itu diperlukan oleh POSIX . Di GNU rm
dan banyak BSD, ini disediakan secara otomatis oleh fts_read
keluarga fungsi hierarki-traversal.
atau .
dan ..
bukan hal-hal nyata?
.
dan ..
yang umumnya entri direktori nyata, walaupun itu adalah filesystem-spesifik. Mereka hampir selalu disajikan seolah-olah mereka adalah entri nyata untuk semua kode pengguna, terlepas dari itu. Banyak perangkat lunak (bukan hanya rm
) khusus-kasus perilaku mereka untuk menangkap atau mencegah pelarian atau rekursi yang tidak diinginkan.