Remoção de backups antigos usando “find” e “cron”

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:

  1. Um diretório na raiz do sistema (/backup) onde os backups ficam armazenados;
  2. Um script rsync para fazer o backup diário dos dados necessários;
  3. Um comando find para encontrar e remover os backups (arquivos e diretórios) com mais de 30 dias; e
  4. 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 encontrados
  • rm -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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *