Devo eliminare tutti i dati compilati:
- directory chiamate
build
, - directory chiamate
obj
, - File *.so.
Ho scritto un comando
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
che attraversa tutte le directory in modo ricorsivo ed elimina tutto ciò di cui ho bisogno.
Perché ho un tale output alla fine?
Forse dovrei scrivere un comando diverso.
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
Risposta accettata:
Usa -prune
nelle directory che eliminerai comunque per dire a find
non preoccuparti di cercare i file al loro interno:
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
Nota anche che *.so
deve essere citato, altrimenti potrebbe essere espanso dalla shell all'elenco di .so
file nella directory corrente.
L'equivalente del tuo GNU -regex
-tipo uno sarebbe:
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Nota che se hai intenzione di utilizzare la sintassi specifica di GNU, potresti anche usare -delete
invece di -exec rm -rf {} +
. Con -delete
, GNU find
attiva -depth
automaticamente. Non esegue comandi esterni, quindi in questo modo è più efficiente e anche più sicuro poiché rimuove la condizione di gara in cui qualcuno potrebbe essere in grado di farti rimuovere i file sbagliati cambiando una directory in un collegamento simbolico nel frattempo find
trova un file e rm
lo rimuove (vedi info -f find -n 'Security Considerations for find'
per i dettagli).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete