Eliminar ficheiros correspondentes em todas as subdirectorias
Como posso remover todos os ficheiros .swp em todas as minhas subdirectorias sob Linux?
Remover todos os ficheiros *.swp sob o directório actual, usar o comando find
numa das seguintes formas:
find . -name \*.swp -type f -delete
A opção -delete
significa encontrar irá apagar directamente os ficheiros correspondentes. Esta é a melhor correspondência com a pergunta real do OP.
Usando a opção -type f
significa que o find só processará ficheiros.
find . -name \*.swp -type f -exec rm -f {} \;
find . -name \*.swp -type f -exec rm -f {} +
Opção -exec
permite encontrar executar um comando arbitrário por ficheiro. A primeira variante executará o comando uma vez por ficheiro, e a segunda executará o menor número possível de comandos, substituindo {}
por tantos parâmetros quanto possível.
find . -name \*.swp -type f -print0 | xargs -0 rm -f
Piping the output to xargs
é utilizado de forma mais complexa por comando de ficheiro do que é possível com -exec
. A opção -print0
diz find
para separar as correspondências com ASCII NULL em vez de uma nova linha, e -0
diz xargs
para esperar uma entrada separada NULL. Isto torna a construção do tubo segura para nomes de arquivo que contenham espaço em branco.
Ver man find
para mais detalhes e exemplos.
Para pesquisar sob o meu directório home (e utilizando o GNU ‘find’ e ‘xargs’), eu utilizaria:
find $HOME -name '*.swp' -print0 | xargs -0 rm -f
A utilização de ‘-print0
’ e ‘-0
’ significa que os nomes serão delimitados por caracteres ASCII NUL ‘\0’, e isto tratará de caminhos de ficheiros com espaços em branco, etc. nos nomes. Se pensa que poderá ter directórios (ou ficheiros de dispositivos, ou FIFOs, ou outros não ficheiros) sob o seu directório terminando com ‘.swp’, poderá adicionar a opção ‘-type f
’ para ‘find’. Se tiver apenas directórios, o comando acima falhará em removê-los ruidosamente.
Se desejar apagar todos os ficheiros de todas as subpastas, pode utilizar o comando fornecido,
$ find . -name \* -type f -delete