Ich habe versucht, das '.' Verzeichnis. Ich dachte, ich könnte einfach mein Arbeitsverzeichnis löschen, ohne in ein übergeordnetes Verzeichnis wechseln zu müssen.
Der Punkt meiner Frage ist, nach einem Einblick zu suchen, wie das Linux-System zum Löschen von Dateien funktioniert.
filesystems
directory
rm
Goldname
quelle
quelle
rm .
undrmdir .
nicht arbeiten, aber warum sind sie angegeben als nicht funktionierend, die von der physischen Existenz eines harten Link unabhängig ist.rm -rf .*
nur, um dies zu finden , und zwar nicht nur,.
sondern auch..
und dann../..
und dann…Antworten:
Das Entfernen des aktuellen Verzeichnisses wirkt sich nicht auf die Dateisystemintegrität oder die logische Organisation aus. Das
.
Entfernen wird verhindert, indem der POSIX-Standard befolgt wird, der auf derrmdir(2)
Handbuchseite wie folgt lautet :Eine Begründung finden Sie in der
rm
Handbuchseite:Andererseits ist das explizite Entfernen des aktuellen Verzeichnisses (dh durch Angabe seines vollständigen oder relativen Pfads) unter Unix eine zulässige Operation, zumindest seit SVR3, wie es mit Unix-Version 7 bis SVR2 verboten war. Dies ist sehr ähnlich zu dem, was passiert, wenn Sie eine Datei entfernen, in die gerade gelesen oder geschrieben wird. Prozesse, die auf die Löschdatei zugreifen, setzen ihre Lese- und Schreibvorgänge fort, als wäre nichts geschehen. Nachdem Sie ein aktuelles Prozessverzeichnis entfernt haben, kann auf dieses Verzeichnis nicht mehr über seinen Pfad zugegriffen werden, aber sein Inode verbleibt im Dateisystem, bis der Prozess abstürzt oder sein eigenes Verzeichnis ändert.
Beachten Sie, dass der Prozess keinen Pfad relativ zu seinem aktuellen Verzeichnis verwenden kann, um seine CWD zu ändern (z. B.
cd ..
), da..
in seinem aktuellen Verzeichnis kein Eintrag mehr vorhanden ist .Wenn jemand etwas eingibt
rmdir .
, erwartet er wahrscheinlich, dass der aktuelle Verzeichniseintrag entfernt wird, aber wenn ein Verzeichnis (unter Verwendung seines Pfads) entfernt wird.
, werden tatsächlich drei Verzeichniseinträge,,..
und das Verzeichnis selbst entfernt.Wenn Sie nur
.
den Verzeichniseintrag dieses Verzeichnisses entfernen und nicht, wird ein nicht konformes Verzeichnis erstellt. Wie bereits erwähnt, ist dies jedoch vom Standard verboten.Wie @Emmanuel zu Recht bemerkte, gibt es einen zweiten Grund, warum das Entfernen
.
nicht erlaubt ist. Es gibt mindestens ein POSIX-kompatibles Betriebssystem (Mac OS X mit HFS +), das mit strengen Einschränkungen das Erstellen von Hardlinks zu vorhandenen Verzeichnissen unterstützt. In einem solchen Fall gibt es keine eindeutige Möglichkeit, aus dem Verzeichnis herauszufinden, welcher Hardlink entfernt werden soll.quelle
..
. Dies ist der Einzelfalllink count > 2
für die überwiegende Mehrheit der Betriebssysteme und Dateisysteme, weshalb "einige Dateisysteme und / oder Betriebssysteme" eine Untertreibung sind. Die einzige nicht historisch bekannte Ausnahme ist Mac OS X mit HFS +, mit dem Einschränkungen hinzugefügt werden, wer und was getan werden kann. Zugegeben, der POSIX-Kommentar bezieht sich auf diese Kuriosität. Siehe unix.stackexchange.com/questions/22394/…rm -r .*
und es hat alles unter dem übergeordneten Verzeichnis rekursiv weggeblasen ... Das war vor mehr als ein oder zwei Jahrzehnten, aber es ist schön zu wissen,rm
dass dies nicht mehr möglich ist.Dies geschieht aus Gründen der Integrität so, da Sie sich derzeit in diesem Verzeichnis befinden und
.
es sich nur um eine Selbstreferenz handelt.Sie müssen entweder das übergeordnete Element aufrufen oder
rmdir
den Pfad angeben. Dies kann folgendermaßen erfolgen:Wenn Sie das häufig benötigen, können Sie einen Alias wie folgt festlegen:
.. die als
rmc
allein aufgerufen werden könnte , um das aktuelle Verzeichnis zu entfernen.quelle
rmdir .
gefährdet der hypothetische Befehl die Integrität des Dateisystems auf eine Weise, die es nicht tutrmdir $(pwd)
oderrmdir "$PWD"
nicht?rm *
und was meinen Sie mit Shell-Verlauf? 2. Die Antwort bezog sich auf den Warum- Teil.rmdir $(pwd)
,pwd
Figuren aus einem logischen Namen für das aktuelle Verzeichnis, zum Beispiel/foo/bar/baz
, und dannrmdir
, diesen Weg zu sehen, entfernt denbaz
Eintrag aus dem/foo/bar
Verzeichnis, sofern die Voraussetzungen erfüllt sind. Das macht Sinn. Der Befehlrmdir .
, auf der anderen Seite, ist eine Anweisung , die entfernen.
Eintrag aus dem aktuellen Verzeichnis, das weder erlaubt (es würde die Bedingung verletzt , dass jedes Verzeichnis einen hat.
Eintrag , der auf mich selbst) noch nützlich (es würde den Link nicht entfernen Sie wollten entfernt werden).