Script Bash para excluir pastas com mais de 30 dias, mas omita o 1º e o 15º

1

Eu tenho uma montagem em que armazeno meus backups de banco de dados e, para evitar que ela cresça além do controle, tenciono manter 30 dias de backups, mas também backups criados a cada 15 dias. Assim, enquanto 30 dias expirarem, se a pasta foi criada no dia 1 ou 15, eu gostaria que ela ficasse bem.

Atualmente, estou usando isso para manter apenas os backups por 30 dias. Como posso omitir pastas criadas no dia 1 e no dia 15?

find /mnt/clusterfs01-data01/db01/* -type d -ctime +30 -exec rm -rf {} \;

Exemplo de listagem de diretório para nomes de pastas.

0 drwx------ 7 root root 324 Nov 11 01:35 2016-11-11_01-31-41
0 drwx------ 7 root root 250 Nov 11 06:25 2016-11-11_06-25-03

Eu não me importo com uma solução diferente de find .

    
por bc2946088 11.11.2016 / 14:49

2 respostas

2

Para excluir correspondências com base na cadeia de data e hora do nome do diretório, você pode adicionar

! \( -name '????-15-??*' -o -name '????-30-??*' \)

ou

-not \( -name '????-15-??*' -o -name '????-30-??*' \)

para o comando find .

Se você realmente quer basear isso no timestamp, então a única maneira que posso pensar em fazer isso é algo como ( note estou usando mtime aqui desde que seus comandos touch não parece modificar o ctime no meu sistema: altere %Td para %Cd para ctime ):

find dir -type d -mtime +30 -printf '%Td\t%p
! \( -name '????-15-??*' -o -name '????-30-??*' \)
' | while read -rd '' day dir; do case "$day" in 15|30) ;; *) echo rm -rf -- "$dir";; esac done
    
por steeldriver 11.11.2016 / 17:56
1

Tente este:

rm -rf $(find /mnt/clusterfs01-data01/db01/* -maxdepth 0 -type d -ctime +30 | grep -v "[0-9]\{4\}-01\|15-[0-9]\{2\}")
    
por Alex Sweetheart 11.11.2016 / 15:39