Warum ist es rm -rf und nicht rmdir -rf

13

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 rmdirfür Verzeichnisvorgänge nicht intuitiver ?

kouroshk
quelle
9
rmdirentfernt Verzeichnisse, rmentfernt. Warum sollte es intuitiv sein rmdir, Nicht-Verzeichnisse zu entfernen?
Stéphane Chazelas
5
Weil es nicht so ist. Sie sind 40 Jahre zu spät, um diese Frage zu stellen, und Sie fragen die falschen Leute.
user207421

Antworten:

25

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 junkund weiß, dass das Schlimmste, was ich getan habe, das Entfernen eines leeren Verzeichnisses war.

msw
quelle
1
Zu dem letzten Satz: Wenn die rekursive Löschoperation aktiviert rmdirwäre, würde sie vermutlich immer noch ein -rFlag benötigen . ( rmdir -r junkanstelle von rm -r junkund rmdir junkfunktioniert immer noch nur, wenn das Verzeichnis leer ist)
user253751
7

Es ist historisch. rmwurde gemacht, um die Verweise auf Dateien rmdirzu entfernen , wurde gemacht, um Verzeichnisse zu entfernen, parallel zu mkdir. Vor vielen Jahren konnte Unix rmVerzeichnisse nur durch Aufrufen entfernen rmdir. Es gab auch keinen rmdir(2)Systemaufruf, es rmdirwurde ein Programm aufgerufen unlink(2).

Verweise:

Dee Hendrick
quelle
2

Eine reine Ansichtssache, rmentfernt aber Dateien, während rmdirVerzeichnisse 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.

Darwin von Corax
quelle
1
Wenn dies der Fall war, warum kann dann kein rmleeres Verzeichnis entfernt werden (außer im rekursiven Modus)?
user253751
Aus demselben Grund kann kein vollständiges Verzeichnis entfernt werden. Das -rFlag ist erforderlich , um die Funktion für Verzeichnis-Sonderdateien zu aktivieren.
Darwin von Corax
1
Zirkuläre Argumentation dort ...
user253751
Ich würde sagen, meine Argumentation hat eine Exzentrizität >> 1 ...
Darwin von Corax