Rmdir (1) ve rm (1) 'in bir arada var olmasının nedeni nedir?


Yanıtlar:


27

Ana sebep muhtemelen tarihseldir. Geri eski, eski günlerde, hiçbir vardı rmdir(2)ve mkdir(2)sistem çağrıları (burada ™ 7. Baskı UNIX tartışıyoruz) ve rmdir(1)(mecburen) kullanılan bir SUID kök programdı unlink(2)dizinleri kaldırmak için sistem çağrısı.

7. Sürüm UNIX el kitaplarına çevrimiçi olarak http://cm.bell-labs.com/7thEdMan adresinden ulaşılabilir (son kontrol tarihi 2017-04-23); Bunlara http://plan9.bell-labs.com/7thEdMan adresinden de ulaşılabilir (son kontrol edilen 2017-04-23). - Ayrıca İnternet'ten en az bir alternatif kaynak var gibi görünüyor http://wolfram.schneider.org/bsd/7thEdManVol2/ bir bağlantı ile, Cilt 2 makaleler için - FreeBSD Cilt 1 komutlar ve sistem çağrıları için sitede .

rmKomutu (normal olmayan SUID programı) çağrılan rmdir(1)boş dizinleri kaldırmak için komut. Kendisi bunu yapamadı; kök ayrıcalıkları gerektiriyordu. Bu nedenle, boş dizinleri kaldırmak için rmdir(1)komut ( Unix V7'deki kaynak kodu için buraya bakın ) vardı ve rmkomut boş dizinlerin kendisini kaldırmadı.

rmDizinleri kaldırmak için kullanmak için -rseçeneği vermeniz gerekir .

Bir simetri argümanı da var. mkdir(1)Dizin oluşturmak için bir komuta ihtiyacınız var ; yaptıklarını rmdir(1)geri almak için bir komuta sahip olmak makul görünmektedir mkdir(1). Artı onlar (bu gün) basit egzersizler rmdir(2)ve mkdir(2)sistem çağrıları - evet, geri 7. Baskı UNIX, mkdir(1)aynı zamanda bir SUID kök programı, mknod(2)bir dizin düğümü link(2)oluşturmak için çağrı ve oluşturmak için çağrı kullanarak .ve.. ve dizinde girişleri .


Aha! bunların hepsi mantıklı, harika!

2
Güzel. Ben sadece burada var 3BSD bir kopyasını kontrol ve orada bir rmdir syscall için hiçbir belge yoktur ve rmdir (1) hala unlink kullanılarak uygulanır.
Andy Ross

4
Mknod + link ve unlink sisteminin önemli bir dezavantajı, bir dizin oluşturmanın atomik bir işlem olmamasıydı, bu yüzden kısmen tam bir dizinle sonuçlanabilirdiniz. Ortaya çıkan tutarsızlıklar için dosya sistemlerini kontrol etmek üzere tasarlanmış birçok program vardı; fsck(1)hayatta kalan.
Jonathan Leffler

@Jonathan, bu konuda Xenix'in anılarını geri getiriyor. Yuck! Evet, gerçekten kötü şeyler olabilir.
Fiasco Labs

6

"rm" dizinlerde çalışmaz. Özyinelemeli silme için rmdir kullanmanız veya -r anahtarını belirtmeniz gerekir. Nedeni tarihseldir unlinkve rmdirayrı sistem çağrılarıdır ve Unix'in ilk günlerinden beri olmuştur.


4
Mutlu bir yan etki, yalnızca bir dosyayı kaldırmak istediğinizde bir dizini yanlışlıkla silme olasılığınızın düşük olmasıdır.

Teşekkür ederim. "Rm -r" ve "rmdir" tuşlarının aynı tuş vuruşlarına sahip olduğunu fark ettim. Rmdir sadece tarihsel nedenlerle var mıdır (.. onlarca yıllık Unix programlarıyla uyumlu)?

2
Aslında, Unix'in ilk günlerinde ne bir sistem çağrısı olarak ne rmdir(2)de mkdir(2)vardı; kullanıcı rootkullanabilir mknod(2)bir dizin düğümü ve oluşturmak için çağrı link(2)oluşturmak için çağrı .ve ..dizindeki girdileri; ve çağrıyı dizin girişlerini kaldırmak için rootkullanabilir unlink(2).
Jonathan Leffler

3

Ayrıca rmdir yalnızca boş dizinleri kaldırır . Bir dizindeki herhangi bir ek dosyayı silmediğinizden emin olmak istiyorsanız rmdir, daha güvenli olur rm -r(rm'yi her zaman sildiğinizi onaylamanız gerekir, örneğin alias rm='rm -i'~ / .bashrc veya ne kullanırsanız kullanın) ).


1

Ayrıca, rmdirboş dizinlerin globbing (joker karakter) ifadeleriyle kaldırılmasını kolaylaştırır. Örneğin, /tmpiçeriğe sahip dosyalara veya dizinlere dokunmadan içindeki tüm boş dizinleri kaldırmak için :

cd /tmp ; rmdir *

Kullanmayı düşünün rmdir /tmp/*. Eğer /tmpdizin gerçekten büyük, bu durum adı başına fazladan beş karakter biraz çabuk argümanlar için alanı tükendi olabilir, ama gerektirmez cddizin hiyerarşisi etrafında hareket. Ayrıca rmdir /tmp/* 2>/dev/nullhata mesajlarını görmekten kaçınmaya değer (tipik olarak çok fazla olacak ve neredeyse hepsi bu görevle alakasız olacaktır).
Jonathan Leffler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.