Warum kann ich das '.' Nicht entfernen? Verzeichnis?

40

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.

Goldname
quelle
1
Versuchen Sie rm -r 'pwd', um das aktuelle
Verzeichnis
7
Diese Frage dupliziert diese Frage nicht. Dieser fragt, warum die harte Verbindung als physikalische Einheit existiert, anstatt synthetisiert zu werden. Diese Frage geht dahin , nicht nur , warum rm .und rmdir .nicht arbeiten, aber warum sind sie angegeben als nicht funktionierend, die von der physischen Existenz eines harten Link unabhängig ist.
JdeBP
9
Bild, das Sie in einen Baum geklettert haben, um einen Zweig abzuschneiden. Auf welcher Seite des Schnitts sitzt du, wenn du anfängst zu sägen? (Das ist das Linux-Dateisystem in Kürze.)
Michael
7
Stellen Sie sich vor, Sie tun rm -rf .*nur, um dies zu finden , und zwar nicht nur, .sondern auch ..und dann ../..und dann…
Gerrit,

Antworten:

89

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 der rmdir(2)Handbuchseite wie folgt lautet :

Wenn sich das path-Argument auf einen Pfad bezieht, dessen letzte Komponente entweder dot oder dot-dot ist, schlägt rmdir () fehl.

Eine Begründung finden Sie in der rmHandbuchseite:

Es ist dem rm-Dienstprogramm untersagt, die Namen dot und dot-dot zu entfernen, um die Folgen einer versehentlichen Ausführung folgender Aktionen zu vermeiden:

rm -r. *

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.

jlliagre
quelle
9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "Die Bedeutung des Löschens von Pfadname / Punkt ist unklar, da der Name der zu entfernenden Datei (Verzeichnis) im übergeordneten Verzeichnis, insbesondere in Gegenwart, nicht klar ist von mehreren Links zu einem Verzeichnis "
Emmanuel
@Emmanuel Das Entfernen eines Verzeichnisses mit mehr als zwei Verknüpfungen (dh es ist nicht leer) ist bereits beabsichtigt verboten (nicht leeres Verzeichnis). Ein Verzeichnis mit einer Linkanzahl von eins ist vom Standard verboten (zumindest bei Dateisystemen, in denen Linkanzahl eine Bedeutung hat).
Juli
3
@jlliagre: Es handelt sich nicht um ein Verzeichnis mit mehreren Links, sondern um ein Verzeichnis mit mehreren Links. Einige Dateisysteme und / oder Betriebssysteme erlauben dies nicht, aber nicht alle.
Jörg W Mittag
@ JörgWMittag Ein Verzeichnis, das mehrere Verzeichnisse enthält, hat mehrere Verknüpfungen, da alle seine Unterverzeichnisse darauf verweisen ... Dies ist der Einzelfall link count > 2fü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/…
jlliagre
Hey, das habe ich schon mal gemacht 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, rmdass dies nicht mehr möglich ist.
Antak
9

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 rmdirden Pfad angeben. Dies kann folgendermaßen erfolgen:

rmdir `pwd`

Wenn Sie das häufig benötigen, können Sie einen Alias ​​wie folgt festlegen:

alias rmc='rmdir `pwd`'

.. die als rmcallein aufgerufen werden könnte , um das aktuelle Verzeichnis zu entfernen.

Julie Pelletier
quelle
13
Aber warum / wie rmdir .gefährdet der hypothetische Befehl die Integrität des Dateisystems auf eine Weise, die es nicht tut rmdir $(pwd)oder rmdir "$PWD"nicht?
G-Man sagt, dass Monica am
4
Es geht nicht um FS-Integrität, sondern um logische Organisation. Wenn Sie Ihr aktuelles Verzeichnis ausgewählt haben, weisen Sie die Shell an, dieses Verzeichnis für die anstehenden Vorgänge zu verwenden. Sie können jedoch nichts von sich selbst entfernen.
Julie Pelletier
7
Ich fürchte, es sieht mutmaßlich aus.
Emmanuel
4
@FranklinPiat Ich fand Ihren Kommentar nicht besonders nützlich: 1. Wo wurde das OP verwendet rm *und was meinen Sie mit Shell-Verlauf? 2. Die Antwort bezog sich auf den Warum- Teil.
JBentley
4
Wenn Sie @ G-Man zu tun rmdir $(pwd), pwdFiguren aus einem logischen Namen für das aktuelle Verzeichnis, zum Beispiel /foo/bar/baz, und dann rmdir, diesen Weg zu sehen, entfernt den bazEintrag aus dem /foo/barVerzeichnis, sofern die Voraussetzungen erfüllt sind. Das macht Sinn. Der Befehl rmdir ., 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).
Hobbs