rm
rekursion funktioniert nur abwärts richtig?
rm -r x y
löscht x
und y
und alles in ihnen (wenn sie Verzeichnisse sind), aber nicht ihre Eltern oder irgendetwas außerhalb von ihnen.
sudo rm -R *.QTFS
Wird 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 -lha
auch 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 rm
den übergeordneten ..
Links folgen , werden rm -r
alle Dateien auf dem System entfernt, indem Sie allen ..
Links bis zum nächsten Schritt folgen /
. rm
sieht 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 rm
Implementierungen 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 rm
und vielen BSDs wird es automatisch von der fts_read
Familie 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.