GNU/Linux >> Linux Esercitazione >  >> Linux

Come conservare:backup giornalieri per una settimana, settimanali per un mese, mensili per un anno e successivamente annuali

Soluzione 1:

Stai seriamente sovradimensionando questo. Male.

Ecco un po' di pseudocodice:

  • Ogni giorno:
    • fai un backup, mettilo in daily cartella
    • rimuovi tutto tranne gli ultimi 7 daily backup
  • Ogni settimana:
    • fai un backup, inseriscilo in weekly cartella
    • rimuovi tutto tranne gli ultimi 5 weekly backup
  • Ogni mese:
    • fai un backup, inseriscilo in monthly cartella
    • rimuovi tutto tranne gli ultimi 12 monthly backup
  • Ogni anno:
    • fai un backup, mettilo in yearly cartella

La quantità di logica che devi implementare è più o meno la stessa, eh? BACIO.

Sembra più facile:

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

Oppure, per numero di file invece che per età:

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

Soluzione 2:

Se vuoi solo mantenere, ad esempio, 8 backup giornalieri e 5 backup settimanali (ogni domenica), funziona così:

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[@]}

Ad oggi (2014-11-10), questo produrrà:

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

Come esercizio lasciato per te, devi solo eliminare tutti i file di backup i cui nomi non compaiono nel keep -array.

Se desideri mantenere anche 13 backup mensili (la prima domenica di ogni mese) e 6 backup annuali (la prima domenica di ogni anno), le cose si fanno un po' più complicate:

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[@]}

Ad oggi (2014-11-10), questo produrrà:

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

Come sopra, basta eliminare tutti i file di backup non trovati in questo array.


Linux
  1. Come utilizzo Ansible e anacron per l'automazione

  2. Come creare attività di pianificazione in Ubuntu per lavori giornalieri / settimanali / mensili

  3. Come posso ottenere la data e l'ora correnti nel terminale e impostare un comando personalizzato nel terminale per questo?

  4. Come determinare il numero della settimana del mese

  5. Come posso aggiungere X giorni fino ad oggi e ottenere una nuova data?

Come aggiungere Icinga Director per Icinga2 e Icinga Web 2.

Come trovare la data e l'ora di installazione del sistema operativo Linux

Come impostare data e ora su Linux

Come iniziare e installare Wine per Ubuntu

Come modificare data, ora e fuso orario in Linux Mint 20

Come mantenere aggiornato Rocky Linux 8