Verifique se os arquivos foram apagados

1

Estou usando o bash e o rsync para criar e armazenar backups do meu site. Estou armazenando essas pastas de datas de ' dd-mm-yyyy '.

Eu tenho feito experiências com o seguinte para excluir essas pastas se elas tiverem mais de x dias (atualmente 2, mas serão mais longas).

find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune

O que foi dito acima funciona, mas quero apenas checar se não estou fazendo algo muito errado aqui.

Eu gostaria de verificar se alguma pasta foi encontrada e se elas foram excluídas, quais foram.

Eu estou querendo saber se isso seria tão simples como algo como o seguinte para verificar se é verdade:

if find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune; then
   ...
fi

Mas não sei ao certo como gostaria de exibir os caminhos das pastas que foram excluídos.

    
por ccdavies 16.06.2018 / 10:21

1 resposta

5

find sai com êxito se encontrou arquivos ou não. Sua definição de sucesso é que os parâmetros da linha de comando são válidos e não houve erros de entrada / saída. Se você quiser saber se encontrou alguns arquivos, faça-o imprimir algo e verifique se a saída não está vazia.

Se você quiser que find imprima o nome de um arquivo que encontrar, insira -print como uma ação. Você pode encadear várias ações (por exemplo, -print , -exec e -prune apenas colocando-as uma após a outra).

find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune

Observe que você precisa de aspas ao redor do padrão passado para -name . Caso contrário, se houver um arquivo correspondente no diretório atual, o shell expandirá esse padrão antes que find o veja.

Se você quiser imprimir o nome de cada arquivo excluído e não apenas do diretório de nível superior de cada backup, e você estiver no Linux (mais precisamente, se você estiver usando o GNU coreutils), você pode passar o -v flag to rm .

Observe que o comando que você postou procura por diretórios correspondentes em todos os lugares em /path/to/files recursivamente, não apenas no nível superior. Eu não tenho certeza se é isso que você pretendia; por exemplo, ele procuraria em backups recentes. Se você deseja apenas corresponder aos diretórios de nível superior, a maneira mais fácil é passar -maxdepth 1 e, em seguida, você não precisa de -prune .

find /path/to/files -maxdepth 1 -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \;

Como alternativa, você pode deixar os nomes de diretório de correspondência de shell e informar find para nunca recorrer a nada aplicando -prune antes de corresponder.

find /path/to/files/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -prune -type d -mtime +2 -print -exec rm -rf {} \;

Mas isso resultará em um erro se não houver arquivos correspondentes ao padrão ou se houver tantos arquivos correspondentes que seus nomes combinados estourarem o comprimento máximo de uma linha de comando. A abordagem -maxdepth não possui esses defeitos.

Se você quiser registrar quais arquivos foram excluídos, redirecione a saída para um arquivo.

{
  echo "# Deletions on $(date)"
  find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune
  echo
} >>backup-deletions.log

Se você estiver preocupado em excluir a coisa errada, registrar o que você excluiu só informaria quando já fosse tarde demais. Você pode fazer uma exclusão por etapas movendo primeiro as coisas para uma "lixeira" e esvaziando a lixeira posteriormente.

# Move things to trash. Use whatever criteria you want.
find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -exec mv {} /path/to/trash \; -prune
# Delete directories from the trash can if they were moved more than
# a week ago.
find /path/to/trash -mindepth 1 -maxdepth 1 -ctime +7 -exec rm -rf {} \;
    
por 16.06.2018 / 10:41