GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist es Rm -rf und nicht Rmdir -rf?

Ich war schon immer neugierig, warum der Befehl zum Löschen von allem in einem Verzeichnis rm -rf ist .

Warum gibt es keine Flags, um dasselbe mit rmdir zu tun ?

Wäre es nicht intuitiver, rmdir zu verwenden für Verzeichnisoperationen?

Akzeptierte Antwort:

Im frühen Unix-Dateisystem (zumindest in den V7-Tagen um 1970) wurden Verzeichnisse als spezielle Dateien implementiert und nur root konnte mknod(2) verwenden Systemaufruf, der sie erstellt hat, und nur root konnte unlink(2) eine spezielle Verzeichnisdatei.

Diese Schutzmaßnahmen waren vorhanden, um die Dateisystemstruktur konsistent zu halten. Wenn es beispielsweise einem Benutzer erlaubt ist, in ein Verzeichnis eine spezielle Datei zu schreiben, könnte er sein übergeordnetes Verzeichnis .. machen auf sich selbst zeigen (insbesondere auf seinen eigenen i-Knoten). Dies würde einen Zirkelverweis im Dateisystem erzeugen, was eine schlechte Sache wäre. Natürlich gibt es noch andere Ungereimtheiten, die man machen könnte, dies ist nur ein klares Beispiel.

Die Konsistenz wurde durch User-Space-Programme wie mkdir(1) aufrechterhalten und rmdir(1) die Set-UID-Root waren, damit sie die privilegierten Systemaufrufe im Namen eines nicht privilegierten Benutzers durchführen konnten. Als Rekursion zu rm(1) hinzugefügt wurde , würde der Befehl remove als aktuelle UID ausgeführt und dann rmdir(1) aufgerufen ausschließlich zum Entfernen leerer Verzeichnisse. 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) wurden als eigene Systemaufrufe hinzugefügt, aber die Relation zwischen rm(1) und rmdir(1) bleibt.

Ich persönlich finde es etwas befriedigender, rmdir junk zu verwenden und wissen, dass das Schlimmste, was ich getan habe, war, ein leeres Verzeichnis zu entfernen.


Linux
  1. Warum erhalten Sie cp:Weglassen des Verzeichnisfehlers in Linux und wie Sie ihn lösen können

  2. $var Vs ${var} Und zitieren oder nicht zitieren?

  3. Warum funktioniert `exit &` nicht?

  4. Warum Deis und was ist das?

  5. So führen Sie den Befehl „find“ nur im aktuellen Verzeichnis und nicht in Unterverzeichnissen aus

Warum erstellt mein symbolischer Link eine Datei und keinen Ordner?

Warum muss ein Ordner ausführbar sein?

Warum ist das schreckliche 'rm -rf /' überhaupt erlaubt?

warum funktioniert sftp rmdir nicht?

Warum nicht ICMP blockieren?

Warum funktioniert mein Crontab nicht und wie kann ich es beheben?