De man xargs
xargs lee elementos de la entrada estándar, delimitados por espacios en blanco (que se pueden proteger con comillas dobles o simples o una barra diagonal inversa) o líneas nuevas, y ejecuta el comando (el valor predeterminado es / bin / echo) una o más veces con cualquier argumento inicial seguido por elementos leídos de la entrada estándar. Las líneas en blanco en la entrada estándar se ignoran.
Podemos (principalmente) arreglar su comando inicial cambiando el delimitador xargs a una nueva línea:
ls | egrep '. ' | xargs -d '\n' rm
(no hagas esto ... sigue leyendo)
Pero, ¿qué pasa si el nombre del archivo contiene una nueva línea?
touch "filename with blanks
and newline"
Debido a que los nombres de archivo Unix pueden contener espacios en blanco y líneas nuevas , este comportamiento predeterminado suele ser problemático; xargs procesa incorrectamente los nombres de archivo que contienen espacios en blanco y / o nuevas líneas. En estas situaciones, es mejor usar la opción -0 , que evita tales problemas.
ls
es realmente una herramienta para el consumo directo de un humano , en su lugar necesitamos usar el find
comando que puede separar los nombres de archivo con un carácter nulo ( -print0
). También necesitamos decirle a grep que use caracteres nulos para separar la entrada ( -z
) y la salida ( -Z
). Finalmente, le decimos a xargs que también use caracteres nulos ( -0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
echo
primera vez, para evitar errores tipográficos. Agregueecho
al frente e imprimirá todos los archivos que va a eliminar.