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 rm
Befehl (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 rm
Befehl entfernte leere Verzeichnisse selbst nicht.
Um rm
Verzeichnisse zu entfernen, müssen Sie die -r
Option 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: unlink
und rmdir
sind separate Systemaufrufe und hat aus den frühen Tagen von Unix gewesen.
rmdir(2)
noch mkdir(2)
einen solchen. Der Benutzer root
kann 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 root
kö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, rmdir
ist 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 rmdir
macht es einfach leere Verzeichnisse mit Globbing (Wildcard) Ausdrücke zu entfernen. So entfernen Sie beispielsweise alle leeren Verzeichnisse in, /tmp
ohne Dateien oder Verzeichnisse mit Inhalten zu berühren:
cd /tmp ; rmdir *
rmdir /tmp/*
. Wenn das /tmp
Verzeichnis 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 cd
der 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).