Neden rm -rf ve rmdir -rf değil


13

Her zaman bir dizindeki her şeyi silme komutunun neden olduğunu merak ettim rm -rf.

Neden aynı şeyi yapacak bayraklar yok rmdir?

rmdirDizin işlemleri için kullanmak daha sezgisel olmaz mı?


9
rmdirdizinleri kaldırır, rmkaldırır. Neden rmdirdizin olmayanları kaldırmak sezgisel olsun ki ?
Stéphane Chazelas

5
Çünkü öyle değil. Yıllarca bu soruyu sormak için geç kaldın ve yanlış insanlara soruyorsun.
user207421

Yanıtlar:


25

İlk Unix Dosya Sisteminde (en azından 1970 V7 günlerinde) dizinler özel dosyalar olarak uygulandı ve sadece kök mknod(2)onları oluşturan sistem çağrısını kullanabilir ve sadece kök unlink(2)bir dizin özel dosyasını olabilir.

Bu korumalar, dosya sistemi yapısını tutarlı tutmak için yürürlükteydi. Örneğin, bir kullanıcının bir dizine özel dosya yazmasına izin verildiyse, üst dizinin kendisini göstermesini sağlayabilir ..(özellikle kendi i-düğümü). Bu, dosya sisteminde Kötü Bir Şey olan döngüsel bir başvuru yaratacaktır. Tabii ki kişinin yapabileceği başka tutarsızlıklar var, bu sadece açık bir örnek.

Tutarlılık, ayrıcalıklı bir kullanıcı adına ayrıcalıklı sistem çağrıları yapabilmeleri için Set-UID kökü gibi mkdir(1)ve benzeri kullanıcı-alanı programları tarafından korunmuştur rmdir(1). Özyineleme eklendiğinde rm(1), remove komutu geçerli UID olarak çalışır ve rmdir(1)yalnızca boş dizinleri kaldırmak için çağrıda bulunur . Bu hala oldukça standart bir izin yükseltme yöntemidir: ihtiyacınız olandan daha fazla izin kullanmayın.

Bir süre sonra mkdir(2)ve rmdir(2)kendi sistem çağrıları ancak arasındaki ilişki olarak eklenmiştir rm(1)ve rmdir(1)kalıntılar.

Şahsen, biraz daha tatmin edici buluyorum rmdir junkve yaptığım en kötü şeyin boş bir dizini kaldırmak olduğunu biliyorum.


1
Son cümle: Muhtemelen, özyinelemeli silme işlemi rmdirolsaydı, yine de bir -rbayrağa ihtiyacı olurdu . ( rmdir -r junkYerine rm -r junkve rmdir junkhala sadece dizin boş ise çalışır)
user253751

7

Tarihsel. rmdosyalara yapılan referansları rmdirkaldırmak, dizinleri kaldırmak için paralel olarak yapılmıştır mkdir. Yıllar önce, Unix rmsadece dizinleri çağırarak kaldırabilirdi rmdir. Bir rmdir(2)sistem çağrısı da yoktu rmdir, çağrılan bir programdı unlink(2).

Referanslar:


2

Tamamen bir fikir meselesidir, ancak dizinleri rmkaldırırken dosyaları rmdirkaldırır. Dizin bir dosyadır, ancak özel bir dosya türüdür, bu yüzden rmonları kaldırmak için mantıklıdır , ancak onları özel olarak işlemek (yani yeteneği etkinleştirmek için ek bir seçenek gerektirmek.) Öte yandan tüm dosyalar dizin değildir, ve rmdirdizin olmayan bir şeyi kaldırmak IMHO'nun hiçbir anlamı yok .


1
Durum böyleyse, neden rmboş bir dizini kaldıramazsınız (özyinelemeli mod hariç)?
user253751

Tam dizini kaldıramadığından aynı şekilde, -rözel dosya dizini özelliğini etkinleştirmek için bayrağa gereksinim duyar .
Darwin von Corax

1
Dairesel akıl yürütme ...
user253751

Muhakememin eksantrikliği olduğunu söyleyebilirim >> 1 ...
Darwin von Corax
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.