Eliminar los archivos coincidentes en todos los subdirectorios
¿Cómo puedo eliminar todos los archivos .swp de todos mis subdirectorios en Linux?
Para eliminar todos los archivos *.swp bajo el directorio actual, utilice el comando find
en una de las siguientes formas:
find . -name \*.swp -type f -delete
La opción -delete
significa que find eliminará directamente los archivos que coincidan. Esta es la que mejor se ajusta a la pregunta real del OP.
Usar -type f
significa que find sólo procesará los archivos.
find . -name \*.swp -type f -exec rm -f {} \;
find . -name \*.swp -type f -exec rm -f {} +
La opción -exec
permite a find ejecutar un comando arbitrario por archivo. La primera variante ejecutará el comando una vez por archivo, y la segunda ejecutará el menor número de comandos posible sustituyendo {}
por el mayor número de parámetros posible.
find . -name \*.swp -type f -print0 | xargs -0 rm -f
La canalización de la salida a xargs
se utiliza para ejecutar comandos por archivo más complejos que los posibles con -exec
. La opción -print0
le dice a find
que separe las coincidencias con ASCII NULL en lugar de una nueva línea, y -0
le dice a xargs
que espere una entrada separada por NULL. Esto hace que la construcción de la tubería sea segura para los nombres de archivo que contienen espacios en blanco.
Vea man find
para más detalles y ejemplos.
Para buscar en mi directorio principal (y utilizando los programas GNU ‘find’ y ‘xargs’), utilizaría
find $HOME -name '*.swp' -print0 | xargs -0 rm -f
El uso de ‘-print0
’ y ‘-0
’ significa que los nombres estarán delimitados por caracteres ASCII NUL ‘\0’, y esto manejará las rutas de archivos con espacios en blanco, etc. en los nombres. Si cree que puede tener directorios (o archivos de dispositivo, o FIFOs, u otros no archivos) bajo su directorio que terminan con ‘.swp’, podría añadir la opción ‘-type f
’ a ‘find’. Si sólo tiene directorios, el comando anterior no los eliminará de forma ruidosa.
Si desea eliminar todos los archivos de todas las subcarpetas, puede utilizar el comando proporcionado,
$ find . -name \* -type f -delete