Warum geht die Rekursion mit rm nicht aufwärts?

13

Ich wundere mich über die Richtung der Rekursion im Allgemeinen und rm im Besonderen.

rm rekursion funktioniert nur abwärts richtig?

sudo rm -R *.QTFSWird ausgeführt : Löscht alle * .QTFS-Dateien im aktuellen Verzeichnis und seinen untergeordneten Dateien, richtig?

aktuelles Verzeichnis durch angezeigt , wie ls -lhaauch enthält .und ..Links für den Mangel eines besseren Wortes, also warum Rekursion diese nach oben im Verzeichnisbaum nicht folgen? Gibt es eine künstliche Grenze für rm App oder .und ..sind nicht wirklich Dinge?


quelle
5
Denn Wurzel und Wahnsinn, so liegt ...
Jasonwryan
1
Nun, für eine interessante Anekdote ... Ich habe rm -rf auf einige unschuldig aussehende Unterverzeichnisse angewendet, nur um zu meinem Entsetzen festzustellen, dass ein Benutzer harte Verknüpfungen zu einem sehr wichtigen Upstream hatte, der dann mit dem Essen fortfuhr. Ja, ich hatte aktuelle Backups und es gingen keine Daten verloren, aber seien Sie vorsichtig ... :-)
Brian Knoblauch
@BrianKnoblauch, welcher Schaden könnte durch Entfernen eines festen Links angerichtet werden? Ich habe nicht verstanden, worum es in Ihrer Geschichte geht ...
Alexey
@Alexey Der Punkt ist, dass der Hardlink selbst nicht entfernt wurde. Es kehrte in das fest verknüpfte Verzeichnis zurück, das mit einem höheren Punkt im Dateisystem verknüpft war, und begann, alle Daten zu verarbeiten ...
Brian Knoblauch,

Antworten:

18

rm rekursion funktioniert nur abwärts richtig?

rm -r x ylöscht xund yund alles in ihnen (wenn sie Verzeichnisse sind), aber nicht ihre Eltern oder irgendetwas außerhalb von ihnen.

sudo rm -R *.QTFSWird ausgeführt : Löscht alle * .QTFS-Dateien im aktuellen Verzeichnis und seinen untergeordneten Dateien, richtig?

Nein. Es werden alle genannten Dateien *.QTFS, alle Dateien, die sich rekursiv in den genannten Verzeichnissen befinden*.QTFS , und diese Verzeichnisse selbst gelöscht . Wenn Sie dieses andere Löschverhalten wünschen, verwenden Sie find -delete.

aktuelles Verzeichnis durch angezeigt , wie ls -lhaauch enthält .und ..Links für den Mangel eines besseren Wortes, also warum Rekursion diese nach oben im Verzeichnisbaum nicht folgen? Gibt es eine künstliche Grenze für rm App oder .und ..sind nicht wirklich Dinge?

Es ist eine künstliche Grenze von rm.

Es ist jedoch nicht wirklich künstlich - es ist die einzige Möglichkeit, wie es jemals funktionieren könnte. Wenn Sie rmden übergeordneten ..Links folgen , werden rm -ralle Dateien auf dem System entfernt, indem Sie allen ..Links bis zum nächsten Schritt folgen /. rmsieht die ..und .-Einträge in jedem Verzeichnis, wenn es den Inhalt auflistet , und ignoriert sie aus diesem Grund explizit.

Sie können das sogar selbst ausprobieren. Run rm -r .und die meisten rmImplementierungen werden sich weigern zu handeln und einen Fehler explizit melden:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(Diese Nachricht stammt von GNUrm ; andere sind ähnlich). Wenn diese Einträge implizit und nicht als explizite Argumente erkannt werden, werden sie einfach ignoriert und fortgesetzt. Dieses Verhalten wird von POSIX benötigt . In GNU rmund vielen BSDs wird es automatisch von der fts_readFamilie der hierarchietraversalen Funktionen bereitgestellt .

oder .und ..sind keine realen dinge

.und ..sind in der Regel echte Verzeichniseinträge, obwohl dies dateisystemspezifisch ist. Sie werden fast immer so dargestellt, als wären sie echte Eingaben in den gesamten Benutzercode, unabhängig davon. Viele Software-Teile sind (nicht nur rm) Sonderfälle ihres Verhaltens, um Ausreißer oder unerwünschte Rekursionen abzufangen oder zu verhindern.

Michael Homer
quelle
Wer nach Beweisen sucht (oder einfach nur interessiert ist), sollte einen Blick darauf werfen, wie dies in GNU coreutils implementiert ist .
Chris Hayes
@ ChrisHayes Der entsprechende Gitweb-Link ist in der Antwort. Der eigentliche rekursive Fall besteht jedoch in der fts_readImplementierung darin, dass nur Befehlszeilenargumente verwendet werden.
Michael Homer
@MichaelHomer Oh wow, so ist es. Das Linkfarbe ist nicht zeichnen sich durch dieses SE Schema. Mein Fehler.
Chris Hayes
2
Diese Antwort ist richtig, aber auch etwas ungenau. rmsieht es nicht einmal, *.QTFSweil es durch Bash in die Dateinamen global erweitert wird, bevor die RM-Binärdatei aufgerufen wird. Die Antwort von @ tobyink merkt das an.
Daenyth
Als Randbemerkung wird angegeben, dass diese .und das ..Verhalten in Sonderfällen die Ursache für die Existenz der Dotfiles sind
mgarciaisaia,
5

Neben dem, was Michael Homer geschrieben hat, gibt es noch einen weiteren Faktor, der es schwierig macht, versehentlich in das übergeordnete Verzeichnis zurückzukehren.

Gehen Sie in Ihr Home-Verzeichnis und geben Sie Folgendes ein:

echo *s*

Sie werden sehen, dass eine Liste von Dateien und Verzeichnissen mit dem Buchstaben "s" angezeigt wird. Es werden jedoch keine Dateien angezeigt, die mit einem führenden Punkt beginnen. Um sie anzuzeigen, können Sie Folgendes verwenden:

echo .*s*

Dies liegt daran, dass sich die Shell weigert, *zu einem führenden Punkt zu expandieren . Das bedeutet, dass:

rm -fr *

Wird nicht wiederkehren ...

tobyink
quelle