2017-09-12 15 views
0

Ceci est la structure de ma sauvegarde:script bash Ubuntu pour supprimer les anciens fichiers de sauvegarde de plusieurs répertoires

  • Les sauvegardes sont stockées dans un répertoire nommé cron_hourly_backup
  • Dans ce répertoire un répertoire est créé chaque jour qui est nommé avec le format ddmmyyyy.
  • Dans chacun de ces répertoires il y a 5-6 sauvegardes db qui sont sous-évalués toutes les heures par un travail cron, et les fichiers de sauvegarde de toutes les heures ont nom unique en utilisant l'horodatage (ex: db1_000000.zip .... db5_000000.zip jusqu'à db1_230000.zip ... db5_230000.zip)

Maintenant, je veux supprimer par programme tous les fichiers de sauvegarde de plus d'un jour (OU, conserver la sauvegarde d'aujourd'hui et d'hier), mais gardez un dernier db (de tous les 5 dbs) pour chaque jour. Comment puis-je atteindre cet objectif?

Actuellement, je fais ceci:

find . -type f \(-name "*_00*" \ 
-o -name "*_01*"-o -name "*_02*" \ 
-o -name "*_03*" -o -name "*_04*" \ 
-o -name "*_05*" -o -name "*_06*" \ 
-o -name "*_07*" -o -name "*_08*" \ 
-o -name "*_09*" -o -name "*_10*" \ 
-o -name "*_11*" -o -name "*_12*" \ 
-o -name "*_13*" -o -name "*_14*" \ 
-o -name "*_14*" -o -name "*_15*" \ 
-o -name "*_16*" -o -name "*_17*" \ 
-o -name "*_18*" -o -name "*_19*" \ 
-o -name "*_20*" -o -name "*_21*" \ 
-o -name "*_22*" \) -delete 

Cela fonctionne très bien, problème est

  1. si la sauvegarde de l'heure 23 n'est pas disponible pour tous les jours, je vais perdre tous les fichiers de ce jour-là .
  2. Il va également supprimer les sauvegardes d'aujourd'hui et d'hier.

Toute suggestion sur la façon de résoudre les 2 problèmes ci-dessus est très appréciée.

+0

Tout les modifier après la création? 'trouver. -type f -nom "db *" -mtime +1 -delete'? – arco444

+0

Non, mais il y a 5-6 db donc j'utilise * pour les inclure tous – Ash

+0

Okay, donc je peux utiliser -mtime pour mon 2ème problème. Toute solution pour le 1er? Je veux vérifier le dernier DB de chaque jour, et supprimer toutes les sauvegardes restantes. – Ash

Répondre

0

Vous ne savez pas quoi "Mais gardez un dernier db (de tous les 5 dbs) pour chaque jour" signifie. Si cela signifie « pour chaque jour de ne conserver que le dernier (dans l'ordre lexicographique) fichier », et si vous avez le coreutilsdate utilitaire, un script bash comme cela pourrait fonctionner (non testé):

#/usr/bin/env bash 

declare -a l       # array of backup files 
bd=cron_hourly_backup    # backup dir 
td=$(date +"%d%m%Y")    # today 
yd=$(date -d yesterday +"%d%m%Y") # yesterday 
for n in "$bd"/*; do 
    if [ ! -d "$n" ]; then 
     continue # skip if not a directory 
    fi 
    if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then 
     continue # skip if today or yesterday 
    fi 
    l=($(ls "$n")) # populate array 
    # loop over all backup files except the last one 
    for ((i = 0; i < ${#l[@]} - 1; i += 1)); do 
     echo "rm -f $n/${l[i]}" # comment when OK 
#  rm -f "$n/${l[i]}"  # uncomment when OK 
    done 
done 

Si vous voulez garder le dernier de chaque dbN_* avec 1<=N<=6, vous pouvez utiliser un plus haut niveau de boucle (non testé):

#/usr/bin/env bash 

declare -a l       # array of backup files 
bd=cron_hourly_backup    # backup dir 
td=$(date +"%d%m%Y")    # today 
yd=$(date -d yesterday +"%d%m%Y") # yesterday 
for n in "$bd"/*; do 
    if [ ! -d "$n" ]; then 
     continue # skip if not a directory 
    fi 
    if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then 
     continue # skip if today or yesterday 
    fi 
    for ((j = 1; j <= 6; j += 1)); do 
     l=($(ls "$n/db${j}_"*)) # populate array 
     # loop over all backup files except the last one 
     for ((i = 0; i < ${#l[@]} - 1; i += 1)); do 
      echo "rm -f ${l[i]}" # comment when OK 
#   rm -f "${l[i]}"  # uncomment when OK 
     done 
    done 
done