Mengapa rekursi tidak naik ke atas dengan rm?

13

Saya bertanya-tanya tentang arah rekursi secara umum dan khusus.

rekursi rm hanya bekerja ke bawah benar?

Menjalankan: sudo rm -R *.QTFSakan menghapus semua file * .QTFS di direktori saat ini dan anak-anaknya, benar?

direktori saat ini seperti yang ditampilkan oleh ls -lhajuga 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?


sumber
5
Karena akar, dan kegilaan, terletak di sana ...
jasonwryan
1
Nah, untuk sebuah anekdot yang menarik ... Saya berlari rm -rf pada beberapa subdirektori yang tampak tidak bersalah pada satu titik hanya untuk menemukan ngeri saya bahwa pengguna memiliki hal-hal yang terkait keras di sana ke hulu yang sangat penting, yang kemudian mulai dimakan. Ya, saya memiliki cadangan saat ini dan tidak ada data yang hilang, tetapi biarkan itu menjadi kisah peringatan ... :-)
Brian Knoblauch
@BrianKnoblauch, kerugian apa yang bisa dilakukan dengan menghapus tautan keras? Saya tidak mengerti maksud Anda ...
Alexey
@ Alexey Intinya adalah bahwa tautan keras itu sendiri tidak dihapus. Itu berulang ke direktori yang ditautkan, yang ditautkan ke titik yang lebih tinggi dalam sistem file, jadi mulai memakan data semua orang ...
Brian Knoblauch

Jawaban:

18

rm rekursi hanya berfungsi dengan benar?

rm -r x yakan menghapus xdan ysemua yang ada di dalamnya (jika itu adalah direktori), tetapi bukan orang tua mereka atau apa pun di luar mereka.

Menjalankan: sudo rm -R *.QTFSakan 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 -lhajuga 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 rmmengikuti ..tautan induk , setiap orang rm -rakan menghapus setiap file di sistem, dengan mengikuti semua ..tautan kembali ke /. rmmelihat ..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 rmimplementasi 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 rmdan banyak BSD, ini disediakan secara otomatis oleh fts_readkeluarga 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.

Michael Homer
sumber
Bagi siapa pun yang mencari bukti (atau sekadar tertarik), lihat bagaimana ini diterapkan di GNU coreutils .
Chris Hayes
@ChrisHayes Tautan gitweb yang setara ada di jawabannya. Kasus rekursif aktual dalam fts_readimplementasi, meskipun, bahwa hanya untuk argumen baris perintah.
Michael Homer
@MichaelHomer Oh wow, begitulah. Warna tautan itu tidak menonjol pada skema SE ini. Kesalahanku.
Chris Hayes
2
Jawaban ini benar tetapi juga sedikit tidak tepat. rmbahkan tidak melihat *.QTFSkarena itu diperluas ke nama file oleh bash sebelum rm binary dipanggil. Jawaban @ tobyink mencatat itu.
Daenyth
Sebagai seorang sidenote, mereka .dan ..perilaku kasus khusus dikatakan sebagai penyebab keberadaan dotfiles
mgarciaisaia
5

Seperti 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:

echo *s*

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:

echo .*s*

Ini karena shell menolak untuk memperluas *untuk mencakup titik terkemuka. Ini berarti:

rm -fr *

Tidak akan muncul kembali ...

tobyink
sumber