Ich war schon immer neugierig, warum der Befehl zum Löschen von allem in einem Verzeichnis lautet rm -rf
.
Warum gibt es keine Flags, mit denen man dasselbe machen kann rmdir
?
Wäre die Verwendung rmdir
für Verzeichnisvorgänge nicht intuitiver ?
Ich war schon immer neugierig, warum der Befehl zum Löschen von allem in einem Verzeichnis lautet rm -rf
.
Warum gibt es keine Flags, mit denen man dasselbe machen kann rmdir
?
Wäre die Verwendung rmdir
für Verzeichnisvorgänge nicht intuitiver ?
Antworten:
Im frühen Unix-Dateisystem (zumindest in den V7-Tagen um 1970) wurden Verzeichnisse als spezielle Dateien implementiert, und nur root konnte den mknod(2)
Systemaufruf verwenden, der sie erstellte, und nur root konnte unlink(2)
eine verzeichnisspezifische Datei erstellen.
Diese Schutzmechanismen waren vorhanden, um die Dateisystemstruktur konsistent zu halten. Wenn ein Benutzer beispielsweise in eine verzeichnisspezifische Datei schreiben darf, kann er das übergeordnete Verzeichnis ..
auf sich selbst verweisen lassen (insbesondere auf seinen eigenen i-Knoten). Dies würde einen Zirkelverweis im Dateisystem erzeugen, der eine schlechte Sache wäre. Natürlich kann man auch andere Unstimmigkeiten feststellen, dies ist nur ein klares Beispiel.
Die Konsistenz wurde von User-Space-Programmen wie mkdir(1)
und rmdir(1)
Set-UID-Root -Programmen aufrechterhalten , damit diese die privilegierten Systemaufrufe für einen nichtprivilegierten Benutzer durchführen konnten. Wenn eine Rekursion hinzugefügt wurde, rm(1)
wurde der Befehl remove als aktuelle UID ausgeführt und anschließend rmdir(1)
nur zum Entfernen leerer Verzeichnisse aufgerufen . Dies ist immer noch eine ziemlich übliche Methode zur Erhöhung von Berechtigungen: Verwenden Sie nicht mehr Berechtigungen, als Sie benötigen.
Irgendwann später mkdir(2)
und rmdir(2)
als eigene Systemaufrufe wurden hinzugefügt, aber die Beziehung zwischen rm(1)
und rmdir(1)
bleibt.
Persönlich finde ich es ein bisschen befriedigender rmdir junk
und weiß, dass das Schlimmste, was ich getan habe, das Entfernen eines leeren Verzeichnisses war.
rmdir
wäre, würde sie vermutlich immer noch ein -r
Flag benötigen . ( rmdir -r junk
anstelle von rm -r junk
und rmdir junk
funktioniert immer noch nur, wenn das Verzeichnis leer ist)
Es ist historisch. rm
wurde gemacht, um die Verweise auf Dateien rmdir
zu entfernen , wurde gemacht, um Verzeichnisse zu entfernen, parallel zu mkdir
. Vor vielen Jahren konnte Unix rm
Verzeichnisse nur durch Aufrufen entfernen rmdir
. Es gab auch keinen rmdir(2)
Systemaufruf, es rmdir
wurde ein Programm aufgerufen unlink(2)
.
Verweise:
Eine reine Ansichtssache, rm
entfernt aber Dateien, während rmdir
Verzeichnisse entfernt werden. Ein Verzeichnis ist eine Datei, aber ein spezieller Dateityp rm
. Daher ist es sinnvoll , sie zu entfernen, aber speziell zu behandeln (dh eine zusätzliche Option zum Aktivieren der Funktion zu erfordern.). Auf der anderen Seite sind nicht alle Dateien Verzeichnisse. und es macht IMHO keinen Sinn rmdir
, etwas zu entfernen, das kein Verzeichnis ist.
rm
leeres Verzeichnis entfernt werden (außer im rekursiven Modus)?
-r
Flag ist erforderlich , um die Funktion für Verzeichnis-Sonderdateien zu aktivieren.
rmdir
entfernt Verzeichnisse,rm
entfernt. Warum sollte es intuitiv seinrmdir
, Nicht-Verzeichnisse zu entfernen?