Como posso recursivamente excluir todos os arquivos de uma extensão específica no diretório atual?

395

Como faço para excluir com segurança todos os arquivos com uma extensão específica (por exemplo, .bak ) do diretório atual e todas as subpastas usando uma linha de comando? Simplesmente, tenho medo de usar rm , já que usei errado uma vez e agora preciso de conselhos.

    
por user216038 15.11.2013 / 14:03

5 respostas

626

Você nem precisa usar rm neste caso se tiver medo. Use find :

find . -name "*.bak" -type f -delete

Mas use com precaução. Corra primeiro:

find . -name "*.bak" -type f

para ver exatamente quais arquivos você removerá.

Além disso, certifique-se de que -delete seja o último argumento em seu comando. Se você colocar antes do -name *.bak argument , ele excluirá tudo .

Veja man find e man rm para mais informações e veja também esta questão relacionada em SE:

por Radu Rădeanu 15.11.2013 / 14:08
32
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
    
por lokers 04.04.2014 / 21:10
26

Primeiro, execute o comando shopt -s globstar . Você pode executá-lo na linha de comando e ele terá efeito somente nessa janela do shell. Você pode colocá-lo no seu .bashrc e, em seguida, todos os novos shells iniciados irão buscá-lo. O efeito desse comando é tornar os arquivos de correspondência **/ no diretório atual e em seus subdiretórios recursivamente (por padrão, **/ significa a mesma coisa que */ : somente nos subdiretórios imediatos). Então:

rm **/*.bak

(ou gvfs-trash **/*.bak ou o que você tem).

    
por Gilles 15.11.2013 / 19:59
18

A exclusão de arquivos é para mim algo que você não deve usar rm para. Aqui está uma alternativa:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Como Flimm afirma nos comentários:

  

O pacote trash-cli faz o mesmo que gvfs-trash sem a dependência do gvfs.

Então:

sudo apt-get install trash-cli

Você não precisa criar um alias para isso, porque o pacote trash-cli fornece um comando trash , que faz o que queremos.

Como Eliah Kagan deixa claro em comentários extensos, você também pode tornar isso recursivo usando find . Nesse caso, você não pode usar um alias, então os comandos abaixo assumem que você instalou trash-cli . Eu resumir os comentários de Eliah:

Este comando encontra e exibe todos os arquivos .bak e links simbólicos em qualquer lugar no diretório atual ou em seus subdiretórios ou abaixo.

find . -name '*.bak' -xtype f

Para excluí-los, anexe um -exec com o comando trash :

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f seleciona arquivos e links simbólicos para arquivos, mas não para pastas. Para excluir pastas .bak também, remova essa parte e use -execdir , o que evita cannot trash non-existent de erros para .bak arquivos dentro de .bak diretórios:

find . -name '*.bak' -execdir trash {} +
    
por don.joey 15.11.2013 / 14:52
3

Se você deseja excluir todos os arquivos de um determinado tipo, mas apenas 1 pasta "deep" da pasta atual:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 porque o diretório atual ". " conta como a primeira pasta.

    
por Hypocritus 26.11.2017 / 18:21