Ich muss alle kompilierten Daten löschen:
- Verzeichnisse namens
build
, - Verzeichnisse namens
obj
, - *.so-Dateien.
Ich habe einen Befehl geschrieben
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
das geht rekursiv durch alle Verzeichnisse 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
Akzeptierte Antwort:
Verwenden Sie -prune
in den Verzeichnissen, die Sie sowieso löschen werden, um find
mitzuteilen sich nicht die Mühe zu machen, Dateien darin zu finden:
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
Beachten Sie auch, dass *.so
muss in Anführungszeichen gesetzt werden, da es sonst von der Shell auf die Liste von .so
erweitert werden kann Dateien im aktuellen Verzeichnis.
Das Äquivalent Ihres GNU -regex
-Typ eins wäre:
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Beachten Sie, dass Sie, wenn Sie eine GNU-spezifische Syntax verwenden möchten, auch -delete
verwenden können statt -exec rm -rf {} +
. Mit -delete
, GNU find
schaltet -depth
ein automatisch. Es führt keine externen Befehle aus, also ist es auf diese Weise effizienter und auch sicherer, da es die Race-Bedingung beseitigt, bei der jemand Sie möglicherweise dazu bringen kann, die falschen Dateien zu entfernen, indem er zwischenzeitlich ein Verzeichnis in einen symbolischen Link ändert find
findet eine Datei und rm
entfernt (siehe info -f find -n 'Security Considerations for find'
). für Einzelheiten).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete