Ich möchte alle Dateien im aktuellen Verzeichnisbaum löschen, mit Ausnahme der Dateien in save
. Ich habe diesen Befehl ausgeführt:
find . \( -name save -prune \) -o -type f -ls | grep /save/
und es fand keine. Aber als ich diesen Befehl ausgeführt habe:
find . \( -name save -prune \) -o -type f -delete
Alle diese Dateien in / save / waren weg. Was vermisse ich?
mv save/ ../some/safer/location
Löschbefehl vor einem solchen "generischen" Löschbefehl (... aber natürlich hätte ich vor Ihrem Post die gleiche Prüfung durchgeführt und wäre auf die gleiche Schwierigkeit gestoßen!). Suchen Sie nun nach einem guten "Undelete" für das Dateisystem, auf dem sich die Dateien befanden ^^Antworten:
-delete
impliziert,-depth
dass das nicht funktioniert-prune
(-depth
beginnt mit den Blättern). Es gibt eine Warnung dazu im Handbuch der GNU-Version (-delete
ist eine FreeBSD-Erweiterung, die jetzt auch von GNUfind
und einigen anderen Implementierungen unterstützt wird).Hier haben Sie die Möglichkeit,
rm
stattdessen Folgendes zu verwenden:(Möglicherweise unsicher, wenn sich darin Verzeichnisse befinden, die von anderen geschrieben werden können, da Sie möglicherweise Dateien außerhalb der aktuellen Verzeichnisstruktur löschen, indem Sie Verzeichnisse durch Symlinks ersetzen, während Sie diesen Befehl ausführen.)
Eine sicherere Alternative:
Das hat zwar nicht das oben erwähnte Problem, bedeutet aber, dass eine
rm
Datei pro Datei ausgeführt wird. Das--
ist für die FreeBSD-Implementierung notwendig, nicht für die GNU, der Dateinamen vorangestellt sind./
.Alternativ, wie von Costas vorgeschlagen:
(aber das steigt immer noch unnötigerweise in
save
Verzeichnisse)Das
LC_ALL=C
ist dort also*
stimmt mit jeder Folge von Bytes überein (auch mit denen, die im aktuellen Gebietsschema keine gültigen Zeichen bilden). Beachten Sie, dass dies Auswirkungen auf die Sprache der Fehlermeldungen hat (Englisch anstelle der Sprache des Benutzers).quelle
rm
?