Estou tentando excluir um monte de arquivos em um determinado diretório (no Mac OS X usando o Terminal)
ls | grep \([1-9]\) | xargs rm
deve fazer o truque, mas não. Estou tentando excluir qualquer arquivo com um único dígito entre parênteses no nome do arquivo (duplicados baixados da web), mas acaba fazendo algo parecido com isto:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
porque não interpreta o espaço correto. Ele deve excluir "520syllabus2010 (3) .pdf"
Qual é a maneira correta de fazer isso?
Obrigado Jeff
#
.#
.(3)
. É melhor citar argumentos para que o shell não os afete.Respostas:
Versão curta:
Não canalize
ls
paraxargs
. Em vez disso, passefind ... -print0
paraxargs -0
, a fim de evitar esses problemas.... que pode ser escrito como:
e:
que pode ser reduzido para apenas
rm
com um curinga.Normalmente,
ls
efind
separe os nomes de arquivo com novas linhas, masxargs
divida sua entrada por nova linha ou espaço, resultando no comportamento que você vê.É possível dizer
xargs
para dividir apenas por nova linha, mas os arquivos também podem ter novas linhas em seus nomes. De fato, no Linux e no BSD, o único caractere não permitido é o byte "nulo" ou zero - portanto é o que você deve usar nesses casos.No exemplo 2 acima,
-print0
dizfind
para separar nomes de arquivos com um byte nulo; o mesmo paraxargs -0
. (Algumas outras ferramentas também têm opções semelhantes, comosort -z
ougrep -zZ
.)A "versão curta" usa um curinga shell simples ("padrão" no
bash
manual - consulte a seção "Expansão do nome do caminho").fonte
*" "\\([1-9]\\).*
lo para que apenas os arquivos com um espaço antes do número pareado antes do período (a, para ser justo) sejam excluídos.