Usuários Linux experientes sabem que o comando find
é um dos mais úteis e importantes no dia-a-dia. Basicamente ele é utilizado para encontrar arquivos com base em um conjunto de parâmetros e opções, mas não se engane: esse é o uso mais básico (e talvez o menos freqüênte) mas você pode utilizá-lo para encontrar arquivos e diretórios de diversas maneiras e, além disso, executar ações sobre os resultados encontrados.
Com o find
você pode, por exemplo, alterar recursivamente todas as permissões em uma árvore de diretórios, encontrar arquivos antigos (de acordo com vários parâmetros), enontrar arquivos pertencentes a um determinado usuário… a lista de coisas que você pode fazer com o find
é enorme. Ele é um comando tão útil que a “bíblia” dos administradores de sistemas Linux/Unix devota um capítulo inteiro só para ele: Unix Power Tools.
Meus desktops Linux contam com um diretório local de backup que mantém os últimos 30 dias de arquivos e diretórios importantes (esses dados são sincronizados remotamente para armazenamento de longo prazo mas, como o intuito deste texto é comentar sobre o find
, não entrarei nesses detalhes).
Meu setup é basicamente o seguinte:
- Um diretório na raiz do sistema (/backup) onde os backups ficam armazenados;
- Um script
rsync
para fazer o backup diário dos dados necessários; - Um comando find para encontrar e remover os backups (arquivos e diretórios) com mais de 30 dias; e
- Um cron job que roda tudo diariamente.
O comando find
que encontra todos os diretórios de backup com mais de 30 dias e apaga esses diretórios/arquivos é:
find /backup -depth -type d -mtime 30 -exec rm -fr {} \;
Explicando o comando acima:
- /backup é o diretório que contém o conteúdo a ser pesquisado
-type d
indica que a busca será por diretórios-mtime 30
indica que a busca retornará arquivos/diretórios com mais de 30 dias-exec
é um operador que permite a execução de qualquer outro comando sobre os diretórios/arquivos encontradosrm -fr
é a ação que eu quero que seja executada, apagar de modo forçado e recursivo os backups antigos{}
funciona como uma variável que contém o nome dos arquivos/diretórios encontrados\;
marca o fim do operador-exec
-depth
indica que a execução do comando de remoção será “de baixo para cima”, ou seja, em uma ordem “depth-first” (os conteúdos de nível mais baixo serão apagados antes do conteúdo de nível imediatamente acima e assim por diante). Essa opção é importante nessa situação pois se a ordem fosse ao contrário, ao apagar um diretório antes de seu conteúdo, receberíamos várias mensagens de erro ao tentar apagar o conteúdo (que já não existiria mais).
Agora basta automatizar o find
com um cron job para o usuário root (ou outro usuário adequado). O cron job que eu utilizo roda o find
todo dia, 05:00h:
# Mantém os últimos 30 dias de backup:
00 05 * * * find /backup -depth -type d -mtime 30 -exec rm -fr {} \;
Enfim, se você procura uma solução simples para apagar backups antigos, com os próprios utilitários de sua distribuição Linux, essa é uma boa opção.