Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
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.
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
11 Mai 2011, 16:46
17 Jan 2011, 11:33
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!
17 Jan 2011, 09:13
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
17 Jan 2011, 08:57
Abraços,
Ernesto.
17 Jan 2011, 08:27
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 {} \;





