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
- hacer una copia de seguridad, poner en
- Todas las semanas:
- hacer una copia de seguridad, poner en
weekly
directorio - eliminar todo excepto los últimos 5
weekly
copias de seguridad
- hacer una copia de seguridad, poner en
- Cada mes:
- hacer una copia de seguridad, poner en
monthly
directorio - eliminar todo excepto los últimos 12
monthly
copias de seguridad
- hacer una copia de seguridad, poner en
- Cada año:
- hacer una copia de seguridad, poner en
yearly
directorio
- hacer una copia de seguridad, poner en
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.