GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo mantener:copias de seguridad diarias durante una semana, semanales durante un mes, mensuales durante un año y anuales después de eso

Solución 1:

Estás seriamente sobre-diseñando esto. Mal.

Aquí hay un pseudocódigo:

  • Todos los días:
    • hacer una copia de seguridad, poner en daily directorio
    • eliminar todo excepto los últimos 7 daily copias de seguridad
  • Todas las semanas:
    • hacer una copia de seguridad, poner en weekly directorio
    • eliminar todo excepto los últimos 5 weekly copias de seguridad
  • Cada mes:
    • hacer una copia de seguridad, poner en monthly directorio
    • eliminar todo excepto los últimos 12 monthly copias de seguridad
  • Cada año:
    • hacer una copia de seguridad, poner en yearly directorio

La cantidad de lógica que tienes que implementar es casi la misma, ¿eh? BESO.

Esto parece más fácil:

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

O bien, por recuento de archivos en lugar de antigüedad:

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

Solución 2:

Si solo desea mantener, por ejemplo, 8 copias de seguridad diarias y 5 copias de seguridad semanales (todos los domingos), funciona así:

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

A partir de hoy (2014-11-10), esto generará:

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

Como ejercicio que te queda, solo tienes que eliminar todos los archivos de copia de seguridad cuyos nombres no aparecen en el keep -matriz.

Si desea mantener 13 copias de seguridad mensuales (primer domingo de cada mes) y 6 copias de seguridad anuales (primer domingo de cada año), las cosas se complican un poco más:

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

A partir de hoy (2014-11-10), esto generará:

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

Igual que arriba, simplemente elimine todos los archivos de copia de seguridad que no se encuentren en esta matriz.


Linux
  1. Cómo uso Ansible y Anacron para la automatización

  2. Cómo usar rsync avanzado para grandes copias de seguridad de Linux

  3. SSHFS? ¿Qué es eso y cómo lo uso?

  4. Cómo determinar el número de semana del mes.

  5. ¿Cómo agrego X días a la fecha y obtengo una nueva fecha?

Cómo agregar Icinga Director para Icinga2 e Icinga Web 2.

Cómo encontrar la fecha y hora de instalación del sistema operativo Linux

Cómo configurar la fecha y la hora en Linux

Cómo comenzar e instalar Wine para Ubuntu

Cómo cambiar la fecha, la hora y la zona horaria en Linux Mint 20

Cómo mantener actualizado Rocky Linux 8