web-dev-qa-db-fra.com

Script Bash pour supprimer les dossiers de plus de 30 jours, mais omettre les 1er et 15ème

J'ai une monture sur laquelle je stocke mes sauvegardes de base de données et, pour éviter toute prolifération incontrôlable, je souhaite uniquement conserver des sauvegardes d'une durée de 30 jours, mais également des sauvegardes créées tous les 15 jours. Donc, à l'expiration du délai de 30 jours, si le dossier a été créé le 1er ou le 15, j'aimerais qu'il reste également.

J'utilise actuellement cette option pour ne conserver que les sauvegardes pendant 30 jours. Comment puis-je omettre les dossiers créés le 1er et le 15?

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

Exemple de liste de répertoires pour les noms de dossiers.

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

Je ne crains pas une solution autre que find.

1
user508889

Pour exclure les correspondances basées sur la chaîne datetime du nom de répertoire, vous pouvez ajouter

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

ou

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

à la commande find.

Si vous voulez vraiment vous baser sur l'horodatage, la seule façon dont je peux penser est de faire quelque chose comme (note J'utilise mtime ici depuis votre touch les commandes ne semblent pas modifier la ctime sur mon système: changez %Td en %Cd pour ctime):

find dir -type d -mtime +30 -printf '%Td\t%p\0' | 
    while read -rd '' day dir; do 
      case "$day" in 
        15|30) ;; 
        *) echo rm -rf -- "$dir";; 
      esac
    done
2
steeldriver

Essaye celui-là:

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