Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Curso de Inglês Online

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.

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

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 2.95/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (1343 votos)

Opinião dos Leitores

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
Treinamentos, Consultorias e Soluçoes em TI. Baseados em softwares livres e padrões abertos para ambientes de missão crítica

Submarino.com.br

Expressões Regulares - Uma abordagem divertida 3ª edição