¿Cómo usar el comando find para eliminar archivos que coinciden con un patrón?

17

Estoy tratando de escribir un comando bash que elimine todos los archivos que coincidan con un patrón específico; en este caso, son todos los viejos archivos de registro de vmware que se han acumulado.

He intentado este comando:

find . -name vmware-*.log | xargs rm

Sin embargo, cuando ejecuto el comando, se bloquea en todas las carpetas que tienen espacios en sus nombres. ¿Hay alguna forma de formatear la ruta del archivo para que xargs lo pase a rm citado o escapado correctamente?

Dan Monego
fuente
Publicación
pausa hasta nuevo aviso.

Respuestas:

20

Generalmente encuentro que usar la -execopción para findser más fácil y menos confuso. Prueba esto:

find . -name vmware-*.log -exec rm -i {} \;

Se considera que todo lo que -execsigue es un comando a ejecutar para cada resultado, hasta el ;, que se escapa aquí para que se pase a find. El {}se reemplaza con el nombre de archivo que findnormalmente se imprimiría.

Una vez que haya verificado que hace lo que desea, puede eliminar el -i.

Jeff Snider
fuente
1
Además, si solo desea eliminar archivos y no directorios, puede agregar '' -tipo f '' al comando de búsqueda.
JamesHannah el
18

Si tienes GNU findpuedes usar la -deleteopción:

find . -name "vmware-*.log" -delete

Para usar xargsy evitar el problema con espacios en los nombres de archivo:

find . -name vmware-*.log -print0 | xargs -0 rm

Sin embargo, sus archivos de registro no deberían tener espacios en sus nombres. Es probable que los documentos de procesamiento de texto y los archivos MP3 los tengan, pero debería poder controlar los nombres de sus archivos de registro.

Pausado hasta nuevo aviso.
fuente
Está muy bien. No sabía sobre eso.
Jeff Snider
8

Puede indicar findque delimite la lista de salida con NULL y xargsque reciba su lista de entrada de la misma manera:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Además, asegúrese de escapar *, ya sea con una barra diagonal inversa o con vmware-*.logcomillas simples, de lo contrario su shell puede intentar expandirlo antes de pasarlo find.

James Sneeringer
fuente
6

No olvides la -deleteopción de encontrar . Elimina el archivo sin error con caracteres especiales ...

Dom
fuente