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