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


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 desde que eu usei errado uma vez e agora eu preciso de conselhos.


421
2017-11-15 13:03


origem




Respostas:


Você nem precisa usar rm neste caso, se você está com medo. Usar find:

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

Mas use-o 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 é o último argumento em seu comando. Se você colocar antes do -name *.bak argument, vai apagar tudo.

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


660
2017-11-15 13:08



Como isso é diferente de rm *.bak? - sayantankhan
@ Bolt64 Seu rm *.bak não funcionará para subdiretórios. - Radu Rădeanu
Com configurações padrão rm *.bak só irá apagar todos os arquivos terminados em .bak no diretório atual. Para também fazer coisas em subdiretórios que você precisa mexer com globs, use a opção -r ou use o exemplo de localização. - Hennes
@Hennes Tenha cuidado com rm -r *.bak! Também remove diretórios terminados em .bak com todo o seu conteúdo. - Radu Rădeanu
Certificar-se de que aquele -delete é o último argumento em seu comando. Se você colocar antes do -name *.bak argumento, irá apagar tudo. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Bem-vindo ao askubuntu! Enquanto esta é uma resposta perfeitamente válida, eu não acho que haja alguma vantagem em usar isso ao invés do -delete bandeira de find. Mais informações podem ser encontradas no Entrada de manuais GNU para excluir arquivos com find. - Glutanimate
provavelmente você está certo, é apenas uma solução alternativa, talvez mais crua;) - lokers
Isso não é apenas uma alternativa, mas um exemplo de como outros comandos podem ser combinados com o pipe '|'. +1 - Boris Pavlović
Essas soluções alternativas funcionam em outros ambientes que não possuem exclusão (como o cygwin) - ciriarte
Eu acho que esta é a melhor resposta aqui. - Léo Léopold Hertz 준영


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 colocar na sua .bashrc, e então todos os novos shells começarão a pegá-lo. O efeito desse comando é fazer **/ arquivos de correspondência no diretório atual e seus subdiretórios recursivamente (por padrão, **/ significa a mesma coisa que */: apenas nos subdiretórios imediatos). Então:

rm **/*.bak

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


28
2017-11-15 18:59





Excluir arquivos não é para mim algo que você 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 de gvfs.

Assim:

sudo apt-get install trash-cli

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

Como Eliah Kagan deixa claro em comentários extensos, você também pode fazer isso de forma recursiva 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 .bak arquivos 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 trash comando:

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 erros para .bak arquivos dentro .bak diretórios:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Não use rm deletar coisas "é uma afirmação controversa, mas eu tenho que concordar que muitas vezes é mais sábio usar algo que lhe permitirá desfazer as coisas. - Oli♦
O pacote trash-cli faz o mesmo que gvfs-trash sem a dependência de gvfs. - Flimm
Eu editei na resposta, da próxima vez sinta-se livre para fazer a edição. - don.joey
@ don.joey Esta resposta parece dizer find . -name "*.bak" -type f exibe o que trash *.bak exclui. Isso é realmente o que você quer dizer? Você pode mover diretórios para o lixo com trash ou gvfs-trash, mas trash *.bak só move arquivos e diretórios cujos nomes terminam com .bak e que residem imediatamente no diretório atual. O shell se expande *.bak, assim trash *.bak não afetará .bak arquivos em subdiretórios não nomeados .bak. - Eliah Kagan
@ don.joey Sim ls *.bak (o que eu acho que você quer dizer) lista o que trash *.bak Lixeiras find . -name '*.bak' -xtype f -exec trash {} + trashes tudo .bak arquivos em qualquer lugar sob .. Não é possível usar um alias, então instale trash-cli Ou escreva gvfs-trash em vez de. Aqui está um exemplo.  -xtype f seleciona arquivos e links simbólicos para arquivos, mas não para pastas. Deletar .bak  pastas também use find . -name '*.bak' -execdir trash {} +, o que evita cannot trash non existent erros para .bak arquivos dentro .bak diretórios. Por favor, sinta-se à vontade para usar qualquer um desses itens em sua resposta. - Eliah Kagan


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.


3
2017-11-26 17:21





Se você está dentro de um repositório do git, você pode usar:

git clean -fdx

Isso exclui arquivos e arquivos não acompanhados em .gitignore.


0
2017-08-09 07:38