Lösung 1:
Sie überarbeiten das ernsthaft. Schlecht.
Hier ist etwas Pseudocode:
- Jeden Tag:
- Erstelle ein Backup, lege es in
daily
Verzeichnis - entferne alles außer den letzten 7
daily
Sicherungen
- Erstelle ein Backup, lege es in
- Jede Woche:
- Erstelle ein Backup, lege es in
weekly
Verzeichnis - Entferne alles bis auf die letzten 5
weekly
Sicherungen
- Erstelle ein Backup, lege es in
- Jeden Monat:
- Erstellen Sie ein Backup, legen Sie es in
monthly
ab Verzeichnis - Entferne alles außer den letzten 12
monthly
Sicherungen
- Erstellen Sie ein Backup, legen Sie es in
- Jedes Jahr:
- Erstellen Sie ein Backup, legen Sie es in
yearly
ab Verzeichnis
- Erstellen Sie ein Backup, legen Sie es in
Die Menge an Logik, die Sie implementieren müssen, ist ungefähr gleich, nicht wahr? KÜSSEN.
Das sieht einfacher aus:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Oder nach Dateianzahl statt nach Alter:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 != "DIR"' | \
sort -r | \
awk 'NR > 7 {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Lösung 2:
Wenn Sie zum Beispiel nur 8 tägliche Backups und 5 wöchentliche (jeden Sonntag) Backups behalten wollen, funktioniert das so:
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[@]}
Ab heute (10.11.2014) wird Folgendes ausgegeben:
20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110
Als Übung bleibt Ihnen nur noch, alle Sicherungsdateien zu löschen, deren Namen nicht im keep
erscheinen -Array.
Wenn Sie außerdem 13 monatliche Backups (jeden ersten Sonntag im Monat) und 6 jährliche Backups (jeden ersten Sonntag im Jahr) führen möchten, wird es etwas komplizierter:
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[@]}
Ab heute (10.11.2014) wird Folgendes ausgegeben:
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
Wie oben, löschen Sie einfach alle Backup-Dateien, die nicht in diesem Array gefunden werden.