Ich muss alle zusammengestellten Daten löschen:
- Verzeichnisse genannt
build
, - Verzeichnisse genannt
obj
, - * .so Dateien.
Ich habe einen Befehl geschrieben
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
das geht alle verzeichnisse rekursiv durch und löscht alles was ich brauche.
Warum habe ich so eine Ausgabe am Ende? Vielleicht sollte ich einen anderen Befehl schreiben.
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
find
dasfind /search_directory options
Auslassen des Suchverzeichnisses ist keine gute IdeeAntworten:
Verwenden
-prune
Sie diese Option für die Verzeichnisse, die Sie trotzdem löschen möchten, umfind
zu vermeiden, dass Sie versuchen, Dateien in ihnen zu finden:Beachten Sie auch, dass
*.so
in Anführungszeichen gesetzt werden muss, da es sonst von der Shell zur Liste der.so
Dateien im aktuellen Verzeichnis erweitert werden kann.Das Äquivalent Ihres GNU-
-regex
Typs wäre:Beachten Sie, dass Sie, wenn Sie GNU-spezifische Syntax verwenden, auch
-delete
anstelle von verwenden können-exec rm -rf {} +
. Mit-delete
GNUfind
schaltet-depth
automatisch ab . Auf diese Weise werden keine externen Befehle ausgeführt. Dies ist effizienter und sicherer, da dadurch die Race-Bedingung beseitigt wird, bei der Sie möglicherweise in der Lage sind, die falschen Dateien zu entfernen, indem zwischenzeitlich ein Verzeichnis in einen Symlink geändert wirdfind
findet eine Datei undrm
entfernt sie (sieheinfo -f find -n 'Security Considerations for find'
für Details).quelle
-delete
behandelt auch Dinge wie Leerzeichen besser-exec rm -rf {} +
was mit denen auch kein Problem hat.{}
- sollten sie zitiert werden oder nicht? Es scheint ohne Anführungszeichen zu funktionieren, aber GNU Findutils Manual verwendet'{}'
in Beispiel. Kannst du das bitte klären?csh
, aber ich konnte diesen Anspruch nie verifizieren. Sie werden in keiner modernen Shell benötigt, die ich kenne. Sie werden von POSIX definitiv nicht benötigt. In den POSIX-Beispielen werden sie nicht verwendet.-delete
kann nicht mit Verzeichnissen verwendet werden.Ich denke, der Grund dafür ist, dass zuerst
find
der Verzeichnisbaum gelöscht wird und versucht wird, den Verzeichnisinhalt zu überprüfen, was offensichtlich nicht die bestmögliche Reihenfolge ist. Sie könnenfind
die Überprüfung des Inhalts erzwingen :Sie sollten die Verwendung
-delete
für Dateien und-exec rmdir
für Verzeichnisse in Betracht ziehen .quelle
Meine Lösung.
+ vs \; im Befehl -exec
quelle
-exec … {} +
Führt den Befehl für mehrere Dateien gleichzeitig aus, so viele wie in die Befehlszeile passen. Wenn zu viele Dateien vorhanden sind (oder genauer gesagt, wenn die Gesamtlänge der Pfade zu lang ist),find
werden mehrere Instanzen von ausgeführtrm
, und daher wird möglicherweise ein Verzeichnis entfernt, das gerade durchsucht wird. Es ist nur weniger wahrscheinlich mit+
als mit;
, aber+
es löst das Problem nicht.