Excluindo arquivos por data: find + xargs + rm

Publicado por Marcos Miras em 26/07/2008

[ Hits: 23.664 ]

 


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

Áudio no Skype

MySQL Control Center - Gerenciando seu MySQL

Memória de 4GB só mostra 3.3GB no Red Hat e CentOS 5

Turbinando o Firefox

Instalação do Ruby e rubygems

Leitura recomendada

Substituir espaços em branco por underlines em nome de arquivos

Habilitando X11 via SSH no Slackware

Transposição COLUNA x LINHA

Utilizando o chmod parar mudar permissões em arquivos

Shell Script - Usando vários scripts em um só

  

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