você está aqui: Home  → Arquivo de Mensagens

Deleção de Arquivos usando o comando Find

Colaboração: Ernesto Charles Niklaus

Data de Publicação: 17 de janeiro de 2011

Muitas vezes temos arquivos armazenados em diversas pastas, e quando precisamos realizar uma limpeza destes arquivos, existe a grande dificuldade de localizar primeiramente onde estão e depois pasta a pasta realizar a limpeza.

Nesta semana precisei liberar espaço em meu servidor, para isso resolvi limpar os backups mais antigos do mysql que faço usando o script automysqlbackup.sh, aí começa o meu problema.

O comando rm -R não consegue apagar arquivos por expressão regular, ou seja:

rm -R "*2009*" retorna rm: cannot remove `*2009*': No such file or directory.

Procurando no google por soluções encontrei apenas scripts para fazer esta tarefa, sendo que muitos deles listavam arquivos usando o comando find.

Tentando criar minha própria solução, lendo o man do Find, descobri que o próprio comando find tem uma ação de deleção que poderia servir nestes casos, o comando é:

  find [diretório raiz] -name "[a expressão]" -delete

No meu caso que precisava limpar arquivos de 2008 utilizei:

  %find /backups -name "*2009-*.gz" -delete

Com isto todos os arquivos dos subdiretórios abaixo de /backups que continham 2009 em seu nome foram deletados.

Ernesto Charles Niklaus é especialista em Redes de Computadores pelo Centro Universitário Padre Anchieta e Analista de Sistemas na Applied Solutions.


 

 

Veja a relação completa dos artigos de Ernesto Charles Niklaus

Opinião dos Leitores

Ernesto Niklaus
23 Fev 2013, 11:27
http://sourceforge.net/projects/automysqlbackup/
Alex
11 Mai 2011, 16:46
Muito boa a dica (incluindo os comentários), testei as dicas aqui. E realmente se quisermos apenas deletar arquivos a melhor opção é o "-delete" do comando find ao invés de usar "-exec" que chama outro comando (rm) para fazer o que a opção "-delete" do próprio find já faria
André Gomes
17 Jan 2011, 11:33
Prezado Ernesto

Agradeço a dica e a discussão que ela levantou também foi muito interessante.

Mas estava interessado em outra parte da dica. Seria possível você nos disponibilizar seu "automysqlbackup.sh"?

Grato!
Pedro Moura
17 Jan 2011, 09:13
Ernesto,

Parabéns pela dica, realmente o -delete é uma opção mais fácil.
Apenas gostaria de acrescentar que para o caso de diretórios (lembrando que a dica tem como objetivo apagar arquivos), o -delete nos deixaria na mão:

$ mkdir /tmp/teste
$ echo 1 > /tmp/teste/arq1
$ echo 1 > /tmp/teste1
$ echo 1 > /tmp/teste2

$ find /tmp/ -name "teste*"
/tmp/teste1
/tmp/teste2
/tmp/teste

$ find /tmp/ -name "teste*" -delete
find: impossível excluir `/tmp/teste': O diretório não está vazio

ls /tmp/teste/
arq1


Neste caso uma solução, seria usar o -exec

$ find /tmp/ -name "teste*" -exec rm -rf {} \;

find: `/tmp/teste': Arquivo ou diretório inexistente

(apesar do aviso que o diretório não existe, ele foi apagado):

$ ls /tmp/teste
ls: impossível acessar /tmp/teste: Arquivo ou diretório inexistente


Ernesto Niklaus
17 Jan 2011, 08:57
Neste caso o que me referi é ao fato de o RM -R (modo recursivo) não conseguir apagar arquivos com aquela expressão regular dentro dos subdiretórios... o rm *200[7-9]* por exemplo só conseguiria apagar se os arquivos estivesses na raiz do /backup porém os dados estão nas pastas daily, weekly e monthly. O segundo comando passando o -exec acaba sendo uma chama de função, sendo que usando a ação default do find conseguimos melhor performance, mas também funciona... mas concordemos, digitar -delete é mais fácil né...hehehe

Abraços,

Ernesto.
Ricardo Abade
17 Jan 2011, 08:27
Olá,

O comando rm aceita as expressões regulares sim.

O comando abaixo funciona sem problemas, mas precisa estar dentro do diretório /backups:

rm -R *2009*

Por exemplo, para apagar arquivos que tem 2007, 2008 e 2009 no nome:

rm *200[7-9]*

Outra forma de apagar os arquivos utilizando o find poderia ser:

find /backups -name "*2009*" -exec rm -f {} \;
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script