Saya bertanya-tanya tentang arah rekursi secara umum dan khusus.
rekursi rm hanya bekerja ke bawah benar?
Menjalankan: sudo rm -R *.QTFS
akan menghapus semua file * .QTFS di direktori saat ini dan anak-anaknya, benar?
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?
Jawaban:
rm -r x y
akan menghapusx
dany
semua yang ada di dalamnya (jika itu adalah direktori), tetapi bukan orang tua mereka atau apa pun di luar mereka.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, gunakanfind -delete
.Ini batas buatan
rm
.Ini tidak sepenuhnya buatan, meskipun - itu satu-satunya cara yang bisa berhasil. Jika
rm
mengikuti..
tautan induk , setiap orangrm -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 besarrm
implementasi akan menolak untuk bertindak, melaporkan kesalahan secara eksplisit:(pesan itu dari GNU
rm
; 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 GNUrm
dan banyak BSD, ini disediakan secara otomatis olehfts_read
keluarga fungsi hierarki-traversal..
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 hanyarm
) khusus-kasus perilaku mereka untuk menangkap atau mencegah pelarian atau rekursi yang tidak diinginkan.sumber
fts_read
implementasi, meskipun, bahwa hanya untuk argumen baris perintah.rm
bahkan tidak melihat*.QTFS
karena itu diperluas ke nama file oleh bash sebelum rm binary dipanggil. Jawaban @ tobyink mencatat itu..
dan..
perilaku kasus khusus dikatakan sebagai penyebab keberadaan dotfilesSeperti halnya apa yang ditulis oleh Michael Homer, ada faktor lain yang membuatnya sulit untuk secara tidak sengaja muncul kembali ke direktori induk.
Buka direktori home Anda dan ketik sesuatu seperti:
Anda akan melihat bahwa itu menunjukkan daftar file dan direktori yang berisi huruf "s". Namun, tidak ada file yang dimulai dengan titik terkemuka ditampilkan. Untuk menunjukkannya, Anda dapat menggunakan:
Ini karena shell menolak untuk memperluas
*
untuk mencakup titik terkemuka. Ini berarti:Tidak akan muncul kembali
..
.sumber