Exclui recursivamente todos os arquivos com uma determinada extensão [duplicado]

135

Eu quero excluir todos os arquivos * .o em um diretório e seus subdiretórios. No entanto, recebo um erro:

sashoalm@aspire:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove '*.o': No such file or directory

Por outro lado, rm *.o funciona, mas não é recursivo.

    
por sashoalm 22.02.2014 / 13:39

2 respostas

204

Isso é ruim: rm -r não é para excluir arquivos, mas para excluir diretórios. Felizmente, provavelmente, não há diretórios correspondentes a *.o .

O que você deseja é possível com zsh , mas não com sh ou bash (novas versões do bash não podem fazer isso por padrão, mas se a opção globstar do shell estiver ativada: shopt -s globstar ). O padrão de globbing é **/*.o , mas isso não se limitaria a arquivos também (talvez zsh também tenha truques para a exclusão de arquivos que não são arquivos).

Mas isso é um pouco para find :

find . -type f -name '*.o' -delete

ou (como não tenho certeza se -delete é POSIX)

find . -type f -name '*.o' -exec rm {} +
    
por 22.02.2014 / 13:49
47

Não é bem assim que a opção -r de rm funciona:

   -r, -R, --recursive
          remove directories and their contents recursively

rm não tem funcionalidade de pesquisa de arquivos, sua opção -r não faz com que ela desça em diretórios locais e identifique arquivos correspondentes ao padrão fornecido. Em vez disso, o padrão ( *.o ) é expandido pelo shell e rm irá descer e remover qualquer diretório cujo nome corresponda a esse padrão. Se você tivesse um diretório cujo nome terminasse em .o , o comando que você tentou teria excluído, mas não encontrará .o arquivos em subdiretórios.

O que você precisa fazer é usar find :

find . -name '*.o' -delete

ou, para não-GNU find :

find . -name '*.o' -exec rm -r {} \;

Se estiver a utilizar o bash , pode ativar globstar :

shopt -s globstar
rm -r -- **/*.o

OBSERVAÇÃO : todas as três opções excluirão os diretórios cujos nomes terminam em .o , se não for o que você deseja, use um destes:

find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o
    
por 22.02.2014 / 13:52

Tags