Encontre as novas subpastas x e guarde-as, enquanto apaga as restantes

1

Eu tenho um script de backup que é executado uma vez por dia. Ele salva os backups abaixo da pasta de backup em uma subpasta nomeada por data ( $(date +"%F") ).

Outro script para limpeza deve ser executado uma vez por semana. Eu quero que este script mantenha os 10 backups mais recentes e exclua todos os outros.

Atualmente, simplesmente excluo tudo com mais de 10 dias, chamando find $PWD -type d -ctime +10 -exec rm -rf {} + . Mas isso pode destruir todos os backups se não houver backups nos últimos 10 dias por causa de erros que não foram realizados (o que não deve acontecer).

Se o script mantivesse o número de backups disponíveis em 10 ou mais, nada (que) perigoso aconteceria.

Então, como manter apenas as subpastas x mais recentes e excluir todas as outras

    
por NobbZ 02.08.2014 / 23:52

1 resposta

1

Como seus subdiretórios são nomeados com sensatez, você pode excluir todos, exceto os 10 mais recentes, com:

ls -d */ | head -n-10 | xargs rm -rf

Tomando o comando acima, uma parte de cada vez:

  • ls -d */ imprime os subdiretórios em ordem alfabética. Como seus subdiretórios são nomeados por data com $(date +"%F") , isso é o mesmo que listar do mais antigo para o mais recente.

  • head -n-10 imprime todos, exceto as últimas dez linhas. Assim, isso imprime todos, mas os dez subdiretórios mais recentes.

  • O comando xargs rm -rf excluirá todos os nomes de arquivos recebidos de head -n-10 .

Ao testar isso, você pode tentar:

ls -d */ | head -n-10 | xargs echo rm -rf

Isso mostrará a você qual comando rm seria executado sem realmente executá-lo.

O acima não funcionará com subdiretórios que tenham espaços, tabulações ou novas linhas em seus nomes.

    
por 03.08.2014 / 00:41