Como posso remover arquivos contendo espaço em branco recursivamente?

5

Estou tendo alguns problemas com este comando no bash no Ubuntu:

rm $(find . -name "*.exe")

Meu objetivo é remover, recursivamente, todos os arquivos que terminem em .exe . Mas alguns arquivos têm espaços em branco e isso quebra o comando.

Alguma sugestão sobre como abordar esse problema?

    
por Dr Beco 12.07.2011 / 03:13

4 respostas

16
find . -name "*.exe" -exec rm -f '{}' +

Isso tem find formatar o comando e os argumentos, e evita cuidadosamente estragar o nomes (passando cada um deles como um argumento separado para rm ). O '+' significa "faça o máximo que puder em uma execução de rm ".

    
por 12.07.2011 / 03:19
3

Você pode canalizar a saída de find para xargs , especificando que apenas novas linhas devem ser consideradas como delimitadores entre nomes de arquivos:

find -name '*.exe' | xargs -d \n rm

A maneira mais portátil de fazer isso é usar o caractere nulo como delimitador:

find -name '*.exe' -print0 | xargs -0 /bin/rm

Veja a manpage de find para um exemplo que faz isso.

Outra opção é usar o comando que você usou, mas definir o delimitador de argumento interno do bash como somente newlines:

IFS=$'\n'; rm $(find . -name "*.exe");

Aqui, a construção $'...' quoting é usada para criar um caractere de nova linha. Essa abordagem será menos resiliente no caso de uma longa lista de nomes de arquivos do que usando xargs .

    
por 12.07.2011 / 03:22
1

Basta passar a opção -delete para find :

find . -name "*.exe" -delete

Isso evita que você cite e qualquer outro aborrecimento de nome de arquivo e é presumivelmente mais rápido que -exec porque nenhum novo processo precisa ser gerado.

    
por 03.11.2015 / 19:22
0

A fuga manual dos caracteres pode ajudá-lo.

find . -name "*.exe" | sed -s 's/\ /\ /' | xargs rm -f
    
por 12.07.2011 / 03:24