Pular para o conteúdo

Excluindo arquivos por data: find + xargs + rm

Dica publicada em Shell Script / Miscelânea
Marcos Miras marcosmiras
Hits: 46.934 Categoria: Shell Script Subcategoria: Miscelânea
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Resolvendo o REDIRECT_TO do Rails em HTTPS

Áudio no Skype

Acelerando o YUM

Escutando CDs no XMMS

Compilar shell script

Iniciar Thunderbird minimizado

Executando comandos no telnet do Mikrotik via shell script

Bash: Gráficos estatísticos de tráfego de rede

Comando para mostrar o IP utilizado na Internet

Escondendo / Personalizando mensagens de erro no prompt

#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

Entre na sua conta para comentar.