Apa alasan rmdir (1) dan rm (1) hidup berdampingan?

17

Saya menggunakan BSD dan Linux setiap hari, saya tidak pernah memiliki keadaan yang harus saya gunakan rmdir (1) daripada rm (1). Apa tujuan dari keberadaan rmdir?

Howard
sumber
2
OT, tetapi, FWIW, ini menunjukkan penggunaan yang menarik (dan berbeda): cyberciti.biz/faq/linux-unix-remove-directory
pst

Jawaban:

27

Alasan utamanya mungkin historis. Kembali ke masa lalu, masa lalu, tidak ada panggilan sistem rmdir(2)dan mkdir(2)(kami sedang mendiskusikan Edisi ke-7 UNIX ™ di sini), dan rmdir(1)(tentu saja) program root SUID yang menggunakan unlink(2)panggilan sistem untuk menghapus direktori.

Manual 7th Edition UNIX tersedia online di http://cm.bell-labs.com/7thEdMan (terakhir diperiksa 2017-04-23); Mereka juga tersedia di http://plan9.bell-labs.com/7thEdMan (terakhir diperiksa 2017-04-23). Tampaknya juga ada setidaknya satu sumber alternatif online - http://wolfram.schneider.org/bsd/7thEdManVol2/ - untuk artikel di Volume 2, dengan tautan ke situs FreeBSD untuk perintah dan panggilan sistem di Volume 1 .

The rmperintah (program non-SUID biasa) dipanggil rmdir(1)perintah untuk menghapus direktori kosong. Itu tidak bisa melakukannya sendiri; yang membutuhkan hak akses root. Jadi, rmdir(1)perintah (lihat di sini untuk kode sumbernya di Unix V7) ada untuk menghapus direktori kosong, dan rmperintah itu tidak menghapus direktori kosong itu sendiri.

Untuk menggunakan rmuntuk menghapus direktori, Anda harus memberikan -ropsi.

Ada juga argumen simetri. Anda memerlukan perintah mkdir(1)untuk membuat direktori; tampaknya masuk akal untuk memiliki perintah rmdir(1)untuk membatalkan apa yang mkdir(1)dilakukan. Plus mereka (hari ini) adalah latihan sederhana dari panggilan sistem rmdir(2)dan mkdir(2)- ya, kembali di UNIX Edisi ke-7, mkdir(1)juga program root SUID, menggunakan mknod(2)panggilan untuk membuat simpul direktori dan link(2)panggilan untuk membuat .dan ..entri dalam direktori .

Jonathan Leffler
sumber
aha! ini semua masuk akal, hebat!
2
Bagus. Saya baru saja memeriksa salinan 3BSD yang saya miliki di sini dan tidak ada dokumentasi untuk syscall rmdir di sana, dan rmdir (1) masih diimplementasikan menggunakan unlink.
Andy Ross
4
Salah satu kelemahan utama dari tautan + mknod dan sistem unlink adalah bahwa membuat direktori bukanlah operasi atom, sehingga Anda bisa berakhir dengan direktori yang sebagian lengkap. Ada banyak program yang dirancang untuk memeriksa sistem file untuk ketidakkonsistenan yang muncul; fsck(1)adalah orang yang selamat.
Jonathan Leffler
@ Jonathan, membawa kembali kenangan Xenix untuk yang satu itu. Huek! Ya, hal yang sangat buruk bisa terjadi.
Fiasco Labs
6

"rm" tidak berfungsi pada direktori. Anda harus menggunakan rmdir atau menentukan sakelar -r untuk penghapusan rekursif. Alasannya historis: unlinkdan rmdirmerupakan pemanggilan sistem yang terpisah dan telah sejak awal Unix.

Andy Ross
sumber
4
Efek samping yang menyenangkan adalah bahwa Anda sedikit cenderung tidak sengaja menghapus direktori ketika Anda bermaksud untuk menghapus hanya file.
Terima kasih. Saya perhatikan bahwa "rm -r" dan "rmdir" memiliki jumlah penekanan tombol yang sama. Apakah rmdir ada semata-mata karena alasan historis (.. kompatibel dengan program Unix yang sudah lama)?
2
Sebenarnya, di masa-masa awal Unix, tidak ada rmdir(2)atau pun mkdir(2)ada sebagai panggilan sistem; pengguna rootdapat menggunakan mknod(2)panggilan untuk membuat simpul direktori dan link(2)panggilan untuk membuat .dan ..entri dalam direktori; dan rootbisa menggunakan unlink(2)panggilan untuk menghapus entri direktori.
Jonathan Leffler
3

Juga rmdir hanya menghapus direktori kosong . Jika Anda ingin memastikan Anda tidak menghapus file tambahan dalam direktori, rmdirlebih aman daripada rm -r(kecuali jika Anda menggunakan rm sehingga Anda selalu perlu mengkonfirmasi apa yang Anda hapus, yaitu alias rm='rm -i'di ~ / .bashrc atau apa pun yang Anda gunakan ).

Simon A. Eugster
sumber
1

Juga, rmdirmembuatnya mudah untuk menghapus direktori kosong dengan ekspresi globbing (wildcard). Misalnya, untuk menghapus semua direktori kosong /tmptanpa menyentuh file atau direktori apa pun dengan konten:

cd /tmp ; rmdir *
Menepuk
sumber
Pertimbangkan untuk menggunakan rmdir /tmp/*. Jika /tmpdirektori sangat besar, ini mungkin kehabisan ruang untuk argumen sedikit lebih cepat karena tambahan lima karakter per nama, tetapi tidak mengharuskan cdAnda bergerak di sekitar hierarki direktori. Ini juga layak dipertimbangkan rmdir /tmp/* 2>/dev/nulluntuk menghindari melihat pesan kesalahan (biasanya akan ada banyak, dan hampir semuanya tidak akan relevan untuk tugas yang sedang ditangani).
Jonathan Leffler