GNU/Linux >> Znalost Linux >  >> Linux

Jak uchovávat:denní zálohy na týden, týdenní na měsíc, měsíčně na rok a poté ročně

Ř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
  • Každý týden:
    • proveďte zálohu, vložte do weekly adresář
    • odeberte vše kromě posledních 5 weekly zálohy
  • Každý měsíc:
    • proveďte zálohu, vložte do monthly adresář
    • odeberte vše kromě posledních 12 monthly zálohy
  • Každý rok:
    • proveďte zálohu, vložte do yearly adresář

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.


Linux
  1. Jak používám Ansible a anacron pro automatizaci

  2. Jak používat pokročilý rsync pro velké zálohy Linuxu

  3. Jak mohu získat aktuální datum a čas v terminálu a nastavit pro něj vlastní příkaz v terminálu?

  1. Jak vytvořit plánování úloh v Ubuntu pro denní / týdenní / měsíční úlohy

  2. SSHFS? Co to je a jak to mohu použít?

  3. V Linuxu, jak vytvořit soubor s názvem, který je aktuální datum a čas

  1. Jak hledat soubory podle velikosti a přípony?

  2. Jak převést ze dne v roce a roku na datum RRRRMMDD?

  3. Jak určit počet týdnů v měsíci