16 votos

Shell Scripting: Usar la función buscar para eliminar los archivos que coinciden con un patrón

Estoy tratando de escribir un comando de bash que se elimine todos los archivos que coinciden con un patrón específico - en este caso, de la edad de vmware archivos de registro que se han acumulado.

He probado este comando:

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

Sin embargo, cuando ejecuto el comando, se ahoga en todas las carpetas que tienen espacios en sus nombres. Es allí una manera de dar formato a la ruta de acceso del archivo de modo que xargs pasa a rm citado, o bien escapado?

19voto

Jeff Snider Puntos 2292

En general me parece que el uso de la -exec opción find a ser más fácil y menos confuso. Intente esto:

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

Todo después de -exec se toma para ser un comando a ejecutar para cada resultado, hasta el ;, que se escapó de aquí, así que se pasará a find. El {} es reemplazado con el nombre de archivo find normalmente de impresión.

Una vez que hayas verificado que hace lo que usted desea, puede quitar el -i.

17voto

jason saldo Puntos 5036

Si usted tiene GNU find puede utilizar el -delete opción de:

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

El uso de xargs y evitar el problema con los espacios en los nombres de archivo:

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

Sin embargo, los archivos de registro no debe tener espacios en sus nombres. Documentos de procesamiento de textos y archivos MP3 son propensos a tener ellos, pero usted debería ser capaz de controlar los nombres de los archivos de registro.

8voto

James Sneeringer Puntos 4574

Usted puede decirle a find para delimitar la lista de resultados con valores Nulos, y xargs para recibir su lista de entrada de la misma:

$ 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'

También, asegúrese de que usted escapar de la *, con una barra diagonal inversa, o por contener la vmware-*.log entre comillas simples, de lo contrario su concha puede intentar expandirla antes de pasar a find.

5voto

Hallgrim Puntos 7198

No te olvides de los encontrar s -delete opción. Eliminar el archivo sin errores con caracteres especiales...

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: