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?
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.
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 .
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.
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 ).
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:
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).
Jawaban:
Alasan utamanya mungkin historis. Kembali ke masa lalu, masa lalu, tidak ada panggilan sistem
rmdir(2)
danmkdir(2)
(kami sedang mendiskusikan Edisi ke-7 UNIX ™ di sini), danrmdir(1)
(tentu saja) program root SUID yang menggunakanunlink(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
rm
perintah (program non-SUID biasa) dipanggilrmdir(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, danrm
perintah itu tidak menghapus direktori kosong itu sendiri.Untuk menggunakan
rm
untuk menghapus direktori, Anda harus memberikan-r
opsi.Ada juga argumen simetri. Anda memerlukan perintah
mkdir(1)
untuk membuat direktori; tampaknya masuk akal untuk memiliki perintahrmdir(1)
untuk membatalkan apa yangmkdir(1)
dilakukan. Plus mereka (hari ini) adalah latihan sederhana dari panggilan sistemrmdir(2)
danmkdir(2)
- ya, kembali di UNIX Edisi ke-7,mkdir(1)
juga program root SUID, menggunakanmknod(2)
panggilan untuk membuat simpul direktori danlink(2)
panggilan untuk membuat.
dan..
entri dalam direktori .sumber
fsck(1)
adalah orang yang selamat."rm" tidak berfungsi pada direktori. Anda harus menggunakan rmdir atau menentukan sakelar -r untuk penghapusan rekursif. Alasannya historis:
unlink
danrmdir
merupakan pemanggilan sistem yang terpisah dan telah sejak awal Unix.sumber
rmdir(2)
atau punmkdir(2)
ada sebagai panggilan sistem; penggunaroot
dapat menggunakanmknod(2)
panggilan untuk membuat simpul direktori danlink(2)
panggilan untuk membuat.
dan..
entri dalam direktori; danroot
bisa menggunakanunlink(2)
panggilan untuk menghapus entri direktori.Juga rmdir hanya menghapus direktori kosong . Jika Anda ingin memastikan Anda tidak menghapus file tambahan dalam direktori,
rmdir
lebih aman daripadarm -r
(kecuali jika Anda menggunakan rm sehingga Anda selalu perlu mengkonfirmasi apa yang Anda hapus, yaitualias rm='rm -i'
di ~ / .bashrc atau apa pun yang Anda gunakan ).sumber
Juga,
rmdir
membuatnya mudah untuk menghapus direktori kosong dengan ekspresi globbing (wildcard). Misalnya, untuk menghapus semua direktori kosong/tmp
tanpa menyentuh file atau direktori apa pun dengan konten:sumber
rmdir /tmp/*
. Jika/tmp
direktori sangat besar, ini mungkin kehabisan ruang untuk argumen sedikit lebih cepat karena tambahan lima karakter per nama, tetapi tidak mengharuskancd
Anda bergerak di sekitar hierarki direktori. Ini juga layak dipertimbangkanrmdir /tmp/* 2>/dev/null
untuk menghindari melihat pesan kesalahan (biasanya akan ada banyak, dan hampir semuanya tidak akan relevan untuk tugas yang sedang ditangani).