Řešení 1:
Vážně to přeháníš. Špatně.
Zde je nějaký pseudokód:
- Každý den:
- proveďte zálohu, vložte do
daily
adresář - odeberte vše kromě posledních 7
daily
zálohy
- proveďte zálohu, vložte do
- Každý týden:
- proveďte zálohu, vložte do
weekly
adresář - odeberte vše kromě posledních 5
weekly
zálohy
- proveďte zálohu, vložte do
- Každý měsíc:
- proveďte zálohu, vložte do
monthly
adresář - odeberte vše kromě posledních 12
monthly
zálohy
- proveďte zálohu, vložte do
- Každý rok:
- proveďte zálohu, vložte do
yearly
adresář
- proveďte zálohu, vložte do
Množství logiky, kterou musíte implementovat, je přibližně stejné, že? KISS.
Vypadá to jednodušeji:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Nebo podle počtu souborů místo věku:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 != "DIR"' | \
sort -r | \
awk 'NR > 7 {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Řešení 2:
Pokud si chcete ponechat například 8 denních záloh a 5 týdenních (každou neděli) záloh, funguje to takto:
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[@]}
Ode dneška (10. 11. 2014) bude výstup:
20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110
Jako cvičení pro vás stačí smazat všechny záložní soubory, jejichž názvy se neobjevují v keep
-pole.
Pokud si chcete ponechat 13 měsíčních záloh (první neděle každého měsíce) a 6 ročních záloh (první neděle každého roku), věci se trochu zkomplikují:
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[@]}
Ode dneška (10. 11. 2014) bude výstup:
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
Stejně jako výše, pouze smažte všechny záložní soubory, které v tomto poli nenajdete.