De man xargs
O xargs lê itens da entrada padrão, delimitados por espaços em branco (que podem ser protegidos com aspas duplas ou simples ou uma barra invertida) ou novas linhas e executa o comando (o padrão é / bin / echo) uma ou mais vezes com os argumentos iniciais seguidos por itens lidos na entrada padrão. Linhas em branco na entrada padrão são ignoradas.
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"
Como os nomes de arquivos do Unix podem conter espaços em branco e novas linhas , esse comportamento padrão geralmente é problemático; nomes de arquivos contendo espaços em branco e / ou novas linhas são processados incorretamente pelo xargs. Nessas situações, é melhor usar a opção -0 , que evita esses problemas.
ls
é realmente uma ferramenta para consumo direto de um ser humano ; em vez disso, precisamos usar o find
comando que pode separar os nomes de arquivos com um caractere nulo ( -print0
). 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
echo
primeiro, para evitar erros de digitação. Adicioneecho
na frente e ele imprimirá todos os arquivos que serão removidos.