Excluindo arquivos por data: find + xargs + rm

Publicado por Marcos Miras em 26/07/2008

[ Hits: 44.794 ]

 


Excluindo arquivos por data: find + xargs + rm



Olá pessoal, vejo que muita gente tem dúvidas na hora de excluir arquivos por lote, principalmente quando se fala em apagar arquivos por data. Para isso utilizarei o comando find em conjunto com xargs e rm.

Tenho um diretório chamado $HOME/teste/, dentro dele possuo 14 arquivos com datas diferentes:

$ ls -lh
-rw-rw-r-- 1 marcos marcos 0 Jul 1 12:12 arquivo01
-rw-rw-r-- 1 marcos marcos 0 Jul 2 12:12 arquivo02
-rw-rw-r-- 1 marcos marcos 0 Jul 3 12:12 arquivo03
-rw-rw-r-- 1 marcos marcos 0 Jul 4 12:12 arquivo04
-rw-rw-r-- 1 marcos marcos 0 Jul 15 12:12 arquivo05
-rw-rw-r-- 1 marcos marcos 0 Jul 16 12:12 arquivo06
-rw-rw-r-- 1 marcos marcos 0 Jul 17 12:12 arquivo07
-rw-rw-r-- 1 marcos marcos 0 Jul 18 12:12 arquivo08
-rw-rw-r-- 1 marcos marcos 0 Jul 19 12:12 arquivo09
-rw-rw-r-- 1 marcos marcos 0 Jul 20 12:12 arquivo10
-rw-rw-r-- 1 marcos marcos 0 Jul 21 12:12 arquivo11
-rw-rw-r-- 1 marcos marcos 0 Jul 22 12:12 arquivo12
-rw-rw-r-- 1 marcos marcos 0 Jul 22 22:12 arquivo13
-rw-rw-r-- 1 marcos marcos 0 Jul 23 2008 arquivo14

Com o find eu procuro os arquivos e os ordeno por data, posteriormente (após o pipe) executo o xargs e por último o rm. O segredo está no xargs, que pegará o resultado do find e jogará no rm. Veja:

$ find /home/marcos/teste ! -mtime -7 | xargs rm -rf

Ele simplesmente apagou todos os arquivos com mais de sete dias!

$ ls -lh
-rw-rw-r-- 1 marcos marcos 0 Jul 17 12:12 arquivo07
-rw-rw-r-- 1 marcos marcos 0 Jul 18 12:12 arquivo08
-rw-rw-r-- 1 marcos marcos 0 Jul 19 12:12 arquivo09
-rw-rw-r-- 1 marcos marcos 0 Jul 20 12:12 arquivo10
-rw-rw-r-- 1 marcos marcos 0 Jul 21 12:12 arquivo11
-rw-rw-r-- 1 marcos marcos 0 Jul 22 12:12 arquivo12
-rw-rw-r-- 1 marcos marcos 0 Jul 22 22:12 arquivo13
-rw-rw-r-- 1 marcos marcos 0 Jul 23 2008 arquivo14

Você pode usar o parâmetro -mtime no find para arquivos com diferença de dias ou o -mmin para arquivos com diferença de minutos.

[]'s
Marcos Miras

Outras dicas deste autor

Compilar shell script

MySQL Control Center - Gerenciando seu MySQL

Escutando CDs no XMMS

Resolvendo o REDIRECT_TO do Rails em HTTPS

Áudio no Skype

Leitura recomendada

FATAL: Module ndiswrapper not found - Linux Mint Debian

Escondendo / Personalizando mensagens de erro no prompt

Como verificar senha no shell script

Recuperando posição do cursor na última linha editada no VIM

Script de backup + envio de e-mail

  

Comentários
[1] Comentário enviado por pstglia em 26/07/2008 - 15:46h

Opa, blz? Seu exemplo é bacana. O xargs é muito útil, mas nem todo mundo usa.

Com o find da para fazer assim também:

$ find /home/marcos/teste ! -mtime -7 -exec rm {} \;

Um abraço!

[2] Comentário enviado por spezzia em 16/01/2013 - 08:43h

esse rm -rf tambem serve pra apagar diretorios ou só arquivos ?
se eu quizer apagar todos os arquivos com mais de 60 dias naquele diretorio ?

[3] Comentário enviado por dtux em 03/06/2013 - 20:09h

Ficaria dessa forma:
find / -atime +60 -delete
ou
find / -atime +60 -exec rm {} \;
ou utilizando o xargs como nosso amigo:
find / -atime +60 | xargs rm -rf

[4] Comentário enviado por felixbahia em 19/02/2016 - 13:37h

Como faço para deletar arquivos por ano, por exemplo, arquivos criados em 2011, tem como me ajudar?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts