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
- faire une sauvegarde, mettre dans
- Chaque semaine :
- faire une sauvegarde, mettre en
weekly
répertoire - supprimer tout sauf les 5 derniers
weekly
sauvegardes
- faire une sauvegarde, mettre en
- Chaque mois :
- faire une sauvegarde, mettre en
monthly
répertoire - supprimer tout sauf les 12 derniers
monthly
sauvegardes
- faire une sauvegarde, mettre en
- Chaque année :
- faire une sauvegarde, mettre en
yearly
répertoire
- faire une sauvegarde, mettre en
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.