Versão resumida:
rm *\([1-9]\)*
Não canalize ls
para xargs
. Em vez disso, canalize find ... -print0
para xargs -0
, para evitar esses problemas.
find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm
... que pode ser escrito como:
find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;
e:
find . -maxdepth 1 -name '*([1-9])*' -delete
que pode ser reduzido para apenas rm
com um caractere curinga.
Normalmente, ls
e find
separam nomes de arquivos com novas linhas, mas xargs
divide sua entrada por espaço newline ou , resultando no comportamento que você vê.
É possível dizer xargs
para dividir apenas por nova linha, mas os arquivos podem ter novas linhas em seus nomes também. De fato, no Linux e no BSD, o somente caractere desaprovado é o " null " ou zero byte - então é o que você deve usar em tais casos.
No exemplo 2 acima, -print0
informa find
para separar nomes de arquivos com um byte nulo; mesmo para xargs -0
. (Algumas outras ferramentas também têm opções semelhantes, como sort -z
ou grep -zZ
.)
A "versão curta" usa um curinga simples de shell ("padrão" em bash
manual - consulte a seção" Expansão do nome do caminho ").