Necesito borrar todos los datos compilados:
- directorios llamados
build
, - directorios llamados
obj
, - archivos *.so.
Escribí un comando
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
que recorre todos los directorios de forma recursiva y elimina todo lo que necesito.
¿Por qué tengo tal salida al final?
Tal vez debería escribir un comando diferente.
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
Respuesta aceptada:
Usa -prune
en los directorios que vas a eliminar de todos modos para decirle a find
no molestarse en buscar archivos en ellos:
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
También tenga en cuenta que *.so
debe citarse ya que, de lo contrario, el shell puede expandirlo a la lista de .so
archivos en el directorio actual.
El equivalente de su GNU -regex
-el tipo uno sería:
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Tenga en cuenta que si va a usar una sintaxis específica de GNU, también podría usar -delete
en lugar de -exec rm -rf {} +
. Con -delete
, GNU find
activa -depth
automáticamente. No ejecuta comandos externos, por lo que es más eficiente y también más seguro, ya que elimina la condición de carrera en la que alguien puede hacer que elimine los archivos incorrectos cambiando un directorio a un enlace simbólico en el medio. find
encuentra un archivo y rm
lo elimina (consulte info -f find -n 'Security Considerations for find'
para más detalles).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete