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?
Respuestas:
Generalmente encuentro que usar la
-exec
opción parafind
ser más fácil y menos confuso. Prueba esto:Se considera que todo lo que
-exec
sigue es un comando a ejecutar para cada resultado, hasta el;
, que se escapa aquí para que se pase afind
. El{}
se reemplaza con el nombre de archivo quefind
normalmente se imprimiría.Una vez que haya verificado que hace lo que desea, puede eliminar el
-i
.fuente
Si tienes GNU
find
puedes usar la-delete
opción:Para usar
xargs
y evitar el problema con espacios en los nombres de archivo: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.
fuente
Puede indicar
find
que delimite la lista de salida con NULL yxargs
que reciba su lista de entrada de la misma manera:Además, asegúrese de escapar
*
, ya sea con una barra diagonal inversa o convmware-*.log
comillas simples, de lo contrario su shell puede intentar expandirlo antes de pasarlofind
.fuente
No olvides la
-delete
opción de encontrar . Elimina el archivo sin error con caracteres especiales ...fuente