-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 GNU find
und einigen anderen Implementierungen unterstützt wird).
info find --index-search=-delete
Die Verwendung der Aktion '-delete' in der Befehlszeile aktiviert automatisch die Option '-depth' (* note find Expressions: :). Dies kann überraschend sein, wenn Sie zuvor nur mit '-print' getestet haben. Daher sollten Sie in der Regel daran denken, '-depth' explizit zu verwenden.
info find --index-search=-prune
Da '-delete' '-depth' impliziert, kann die Verwendung von '-prune' in Kombination mit '-delete' durchaus dazu führen, dass mehr Dateien gelöscht werden, als Sie beabsichtigt haben.
Hier haben Sie die Möglichkeit, rm
stattdessen Folgendes zu verwenden:
find . -name save -prune -o -type f -exec rm -f {} +
(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:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
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:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(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).
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 ^^