GNU/Linux >> Tutoriels Linux >  >> Linux

Comment conserver :sauvegardes quotidiennes pendant une semaine, hebdomadaires pendant un mois, mensuelles pendant un an et annuelles par la suite

Solution 1 :

Vous sur-concevez sérieusement cela. Mal.

Voici un pseudo-code :

  • Tous les jours :
    • faire une sauvegarde, mettre dans daily répertoire
    • supprimer tout sauf les 7 derniers daily sauvegardes
  • Chaque semaine :
    • faire une sauvegarde, mettre en weekly répertoire
    • supprimer tout sauf les 5 derniers weekly sauvegardes
  • Chaque mois :
    • faire une sauvegarde, mettre en monthly répertoire
    • supprimer tout sauf les 12 derniers monthly sauvegardes
  • Chaque année :
    • faire une sauvegarde, mettre en yearly répertoire

La quantité de logique que vous devez mettre en œuvre est à peu près la même, hein ? BAISER.

Cela semble plus simple :

s3cmd ls s3://backup-bucket/daily/ | \
    awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
    xargs --no-run-if-empty s3cmd del

Ou, par nombre de fichiers au lieu de leur âge :

s3cmd ls s3://backup-bucket/daily/ | \
    awk '$1 != "DIR"' | \
    sort -r | \
    awk 'NR > 7 {print $4;}' | \
    xargs --no-run-if-empty s3cmd del

Solution 2 :

Si vous souhaitez simplement conserver, par exemple, 8 sauvegardes quotidiennes et 5 sauvegardes hebdomadaires (tous les dimanches), cela fonctionne comme ceci :

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
echo ${!keep[@]}

À compter d'aujourd'hui (2014-11-10), cela affichera :

20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110

Comme exercice qui vous est laissé, il vous suffit de supprimer tous les fichiers de sauvegarde dont les noms n'apparaissent pas dans le keep -tableau.

Si vous souhaitez également conserver 13 sauvegardes mensuelles (le premier dimanche de chaque mois) et 6 sauvegardes annuelles (le premier dimanche de chaque année), les choses se compliquent un peu :

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
for i in {0..12}; do
        DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
        for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
        ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
for i in {0..5}; do
        DW=$(date +%-W)
        for (( AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
        ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
echo ${!keep[@]}

À compter d'aujourd'hui (2014-11-10), cela affichera :

20090104 20100103 20110102 20120101 20130106 20131103
20131201 20140105 20140202 20140302 20140406 20140504
20140601 20140706 20140803 20140907 20141005 20141012
20141019 20141026 20141102 20141103 20141104 20141105
20141106 20141107 20141108 20141109 20141110

Comme ci-dessus, supprimez simplement tous les fichiers de sauvegarde introuvables dans ce tableau.


Linux
  1. Comment j'utilise Ansible et anacron pour l'automatisation

  2. SSHFS ? Qu'est-ce que c'est et comment l'utiliser ?

  3. Comment puis-je obtenir la date et l'heure actuelles dans le terminal et définir une commande personnalisée dans le terminal pour cela ?

  4. Comment convertir le jour de l'année et l'année en une date AAAAMMJJ ?

  5. Comment déterminer le numéro de la semaine du mois

Comment ajouter Icinga Director pour Icinga2 et Icinga Web 2.

Comment trouver la date et l'heure d'installation du système d'exploitation Linux

Comment définir la date et l'heure sous Linux

Comment démarrer et installer Wine pour Ubuntu

Comment changer la date, l'heure et le fuseau horaire dans Linux Mint 20

Comment garder Rocky Linux 8 à jour