De man xargs
xargs reads items from the standard input, delimited by blanks (which
can be protected with double or single quotes or a backslash) or
newlines, and executes the command (default is /bin/echo) one or more
times with any initial-arguments followed by items read from standard
input. Blank lines on the standard input are ignored.
Podemos (principalmente) corrigir seu comando inicial alterando o delimitador xargs para uma nova linha:
ls | egrep '. ' | xargs -d '\n' rm
(não faça isso ... continue lendo)
Mas e se o nome do arquivo contiver uma nova linha?
touch "filename with blanks
and newline"
Because Unix filenames can contain blanks and newlines, this default
behaviour is often problematic; filenames containing blanks and/or
newlines are incorrectly processed by xargs. In these situations it is
better to use the -0 option, which prevents such problems.
ls
é realmente uma ferramenta para consumo direto por um ser humano , em vez disso, precisamos usar o comando find
, que pode separar os nomes dos arquivos com um caractere nulo ( -print0
). Nós também precisamos dizer ao grep para usar caracteres nulos para separar a entrada ( -z
) e a saída ( -Z
). Finalmente, dizemos ao xargs que também use caracteres nulos ( -0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm