Mengapa rm -rf dan bukan rmdir -rf

13

Saya selalu penasaran mengapa perintah untuk menghapus semua yang ada di direktori rm -rf.

Mengapa tidak ada bendera untuk melakukan hal yang sama rmdir?

Bukankah lebih intuitif untuk digunakan rmdiruntuk operasi direktori?

kouroshk
sumber
9
rmdirmenghapus direktori, rmmenghapus. Mengapa itu intuitif untuk rmdirmenghapus non-direktori?
Stéphane Chazelas
5
Karena tidak. Anda 40-an tahun terlambat mengajukan pertanyaan ini, dan Anda bertanya kepada orang yang salah.
user207421

Jawaban:

25

Pada Unix File System awal (setidaknya kembali pada hari-hari V7 sekitar tahun 1970) direktori diimplementasikan sebagai file khusus dan hanya root yang dapat menggunakan mknod(2)system call yang membuatnya dan hanya root yang bisa unlink(2)menjadi file direktori khusus.

Perlindungan ini ada untuk menjaga struktur sistem file tetap konsisten. Sebagai contoh, jika pengguna diizinkan untuk menulis ke file khusus direktori, ia dapat membuat direktori induknya ..mengarah ke dirinya sendiri (khususnya node-nya sendiri). Ini akan membuat referensi melingkar dalam sistem file yang akan menjadi Bad Thing. Tentu saja ada inkonsistensi lain yang bisa dibuat, ini hanya contoh yang jelas.

Konsistensi dipertahankan oleh program ruang pengguna seperti mkdir(1)dan rmdir(1)yang merupakan akar Set-UID sehingga mereka dapat membuat panggilan sistem yang diistimewakan atas nama pengguna yang tidak berkepentingan. Ketika rekursi ditambahkan ke rm(1), perintah hapus akan berjalan sebagai UID saat ini dan kemudian memanggil rmdir(1)hanya untuk menghapus direktori kosong. Ini masih merupakan metode standar yang cukup tinggi untuk peningkatan izin: jangan menggunakan lebih banyak izin dari yang Anda butuhkan.

Beberapa waktu kemudian mkdir(2)dan rmdir(2)ditambahkan sebagai panggilan sistem mereka sendiri tetapi hubungan antara rm(1)dan rmdir(1)tetap.

Secara pribadi, saya merasa sedikit lebih memuaskan rmdir junkdan tahu bahwa yang terburuk yang saya lakukan adalah menghapus direktori kosong.

msw
sumber
1
Re kalimat terakhir: Agaknya, jika operasi penghapusan rekursif dalam rmdir, itu masih perlu -rbendera. ( rmdir -r junkAlih-alih rm -r junk, dan rmdir junkmasih hanya berfungsi jika direktori kosong)
user253751
7

Itu sejarah. rmdibuat untuk menghapus referensi ke file, rmdirdibuat untuk menghapus direktori, sejajar dengan mkdir. Bertahun-tahun yang lalu, Unix rmhanya bisa menghapus direktori dengan memohon rmdir. Juga tidak ada rmdir(2)panggilan sistem,rmdir ada program yang memanggil unlink(2).

Referensi:

Dee Hendrick
sumber
2

Murni masalah pendapat, tetapi rmmenghapus file sambil rmdirmenghapus direktori. Direktori adalah file, tetapi jenis file khusus, jadi masuk akal untuk rmmenghapusnya, tetapi memperlakukannya secara khusus (yaitu memerlukan opsi tambahan untuk mengaktifkan kemampuan.) Di sisi lain tidak semua file adalah direktori, dan tidak masuk akal IMHO untuk rmdirmenghapus sesuatu yang bukan direktori.

Darwin von Corax
sumber
1
Jika itu masalahnya, mengapa tidak dapat rmmenghapus direktori kosong (kecuali dalam mode rekursif)?
user253751
Alasan yang sama ia tidak dapat menghapus direktori lengkap - itu memerlukan -rbendera untuk mengaktifkan fitur file khusus direktori.
Darwin von Corax
1
Circular reasoning there ...
user253751
Saya akan mengatakan alasan saya memiliki eksentrisitas >> 1 ...
Darwin von Corax