2009-10-19 27 views
11

Estoy intentando escribir un comando bash que eliminará todos los archivos que coincidan con un patrón específico; en este caso, son todos los archivos de registro de vmware antiguos que se han creado.Creación de scripts en shell: uso de bash con xargs

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. ¿Hay alguna manera de formatear la ruta del archivo para que xargs lo pase a rm citado o escapado correctamente?

+0

Cruz colocado: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

Respuesta

24

Trate de usar:

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

Esto hace que encontrar a la salida de un carácter nulo después de cada nombre de archivo y dice xargs para romper nombres basados ​​en caracteres nulos en lugar de espacios en blanco u otras fichas.

5

Consulte la bandera -0 para xargs; combinado con find's -print0 debe establecerse.

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

No utilice xargs. Encuentra puede hacerlo sin ningún tipo de ayuda:

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

+3

que siempre es bueno para evitar comenzar un proceso adicional, especialmente algo como esto, donde podrías proporcionar algo demasiado largo para xargs. Tenga en cuenta que 'find' incluso tiene una acción' delete' que puede usar en lugar de '-exec ...' - pero es más fácil de personalizar de esta manera. Tampoco tiene que citar las llaves, a menos que esté usando un shell viejo como tcsh. – Cascabel

+3

Pero esto lanzará un proceso 'rm' para cada archivo individualmente, en lugar de pasar varios nombres de archivo a' rm' como 'xargs', por lo que va a ser más lento. – JaakkoK

+5

@jk: Es por eso que las implementaciones más nuevas de 'find' tienen' find -exec rm '{}' + ', que agrupará argumentos como' xargs'. – ephemient

4

GNU encontrar

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

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

uso -iname para la búsqueda de patrones

0

Para evitar problema de espacio en xargs I Usaría un nuevo carácter de línea como sep Arator con la opción -d:

find . -name vmware-*.log | xargs -d '\n' rm 
Cuestiones relacionadas