Ich benutze jeden Tag BSD und Linux, ich hatte noch nie einen Umstand, dass ich rmdir (1) anstelle von rm (1) verwenden muss. Was ist der Zweck der Existenz von rmdir?
Ich benutze jeden Tag BSD und Linux, ich hatte noch nie einen Umstand, dass ich rmdir (1) anstelle von rm (1) verwenden muss. Was ist der Zweck der Existenz von rmdir?
Antworten:
Der Hauptgrund ist wahrscheinlich historisch. Zurück in den alten, alten Zeiten gab es keine rmdir(2)und mkdir(2)Systemaufrufe (wir 7th Edition UNIX diskutieren ™ hier), und rmdir(1)war (notgedrungen) ein SUID root Programm , dass der verwendeten unlink(2)Systemaufruf Verzeichnisse zu entfernen.
Die UNIX-Handbücher der 7. Auflage sind online unter http://cm.bell-labs.com/7thEdMan verfügbar (zuletzt überprüft am 23.04.2017). Sie sind auch unter http://plan9.bell-labs.com/7thEdMan verfügbar (zuletzt überprüft am 23.04.2017). Es scheint auch mindestens eine alternative Quelle online zu sein - http://wolfram.schneider.org/bsd/7thEdManVol2/ - für die Artikel in Band 2, mit einem Link zur FreeBSD- Site für die Befehle und Systemaufrufe in Band 1 .
Der rmBefehl (ein reguläres Nicht-SUID-Programm) hat den rmdir(1)Befehl zum Entfernen leerer Verzeichnisse aufgerufen . Das konnte es selbst nicht. das erforderte root-Rechte. Daher gab es den rmdir(1)Befehl (siehe hier für den Quellcode in Unix V7), um leere Verzeichnisse zu entfernen, und der rmBefehl entfernte leere Verzeichnisse selbst nicht.
Um rmVerzeichnisse zu entfernen, müssen Sie die -rOption angeben.
Es gibt auch ein Symmetrie-Argument. Sie benötigen einen Befehl mkdir(1), um Verzeichnisse zu erstellen. Es erscheint vernünftig, einen Befehl rmdir(1)zu haben, um das, was geschehen ist, rückgängig zu machen mkdir(1). Außerdem sind sie ( in diesen Tagen) einfach exercisors der den rmdir(2)und mkdir(2)Systemaufrufe - ja, zurück in 7. Auflage UNIX, mkdir(1)war auch ein SUID root Programm, das unter Verwendung von mknod(2)Anruf einen Verzeichnisknoten und die zum Erstellen link(2)Aufruf der erstellen .und ..Einträge im Verzeichnis .
fsck(1)ist derjenige, der überlebt hat.
"rm" funktioniert nicht bei Verzeichnissen. Sie müssen entweder rmdir verwenden oder den Schalter -r für eine rekursive Löschung angeben. Der Grund dafür ist historisch: unlinkund rmdirsind separate Systemaufrufe und hat aus den frühen Tagen von Unix gewesen.
rmdir(2)noch mkdir(2)einen solchen. Der Benutzer rootkann den mknod(2)Aufruf verwenden, um einen Verzeichnisknoten zu erstellen, und den link(2)Aufruf, um die Einträge .und ..im Verzeichnis zu erstellen . und rootkönnte den unlink(2)Aufruf verwenden, um die Verzeichniseinträge zu entfernen.
Auch rmdir entfernt nur leere Verzeichnisse. Wenn Sie sicherstellen möchten, dass Sie keine zusätzlichen Dateien in einem Verzeichnis löschen, rmdirist dies sicherer als rm -r(es sei denn, Sie haben einen Alias für rm erstellt, sodass Sie immer bestätigen müssen, was Sie löschen, z. B. alias rm='rm -i'in ~ / .bashrc oder was auch immer Sie verwenden ).
Außerdem rmdirmacht es einfach leere Verzeichnisse mit Globbing (Wildcard) Ausdrücke zu entfernen. So entfernen Sie beispielsweise alle leeren Verzeichnisse in, /tmpohne Dateien oder Verzeichnisse mit Inhalten zu berühren:
cd /tmp ; rmdir *
rmdir /tmp/*. Wenn das /tmpVerzeichnis wirklich groß ist, kann es sein, dass aufgrund der zusätzlichen fünf Zeichen pro Name nicht genügend Platz für Argumente vorhanden ist, Sie müssen sich jedoch nicht in cdder Verzeichnishierarchie bewegen. Es lohnt sich auch zu überlegen rmdir /tmp/* 2>/dev/null, um zu vermeiden, dass Fehlermeldungen angezeigt werden (in der Regel wird es eine Menge geben, und fast alle davon sind für die vorliegende Aufgabe irrelevant).