#!/bin/sh # backup garbage collector # keep: # 1 backup per year the previous years hd=3600 # hour duration: 60s * 60 h12=43200 # 12h dd=86400 # day duration: hd * 24 wd=604800 # week duration: dd * 7 md=2592000 # month duration: dd * 30 yd=31557600 # year duration: dd * 365.25 now=$(date +%Y%m%d_%H%M%S) date2ts() { t=$1; r=${t#????}; Y=${t%$r} t=$r; r=${t#??}; m=${t%$r} t=$r; r=${t#??}; d=${t%$r} t=${r#_}; r=${t#??}; H=${t%$r} t=$r; r=${t#??}; M=${t%$r} S=${t#??} date -d "$Y-$m-$d $H:$M:$S" +%s } # timestamp to date ts2date() { date -d @$ts +%Y%m%d_%H%M%S; } tsn=$(date2ts $now) # minimal retention delay, according to age retention_delay() { d=$(($tsn - $1)) if (($d < $h12)); then R1=0 # keep all backups in the last 12 hours elif (($d < $dd)); then R1=$hd # keep 1 backup per hour in the last day elif (($d < $wd)); then R1=$dd # keep 1 backup per day in the last week elif (($d < $md)); then R1=$wd # keep 1 backup per week in the last month elif (($d < $yd)); then R1=$md # keep 1 backup per month in the last year else R1=$yd # keep 1 backup per year in the previous years fi echo $R1 } # sorted list of backups, most recent first lbu=$(ssh bip ls -rv /home/backup/swift) for d in $lbu; do tsc=$(date2ts $d) if ! [ "$tsp" ]; then echo keep $d tsp=$tsc continue fi mrd=$(retention_delay $tsp) dp=$(($tsp - $tsc)) if (($dp < $mrd)); then echo "delete $d" else echo "keep $d" tsp=$tsc fi done