#!/bin/sh # tarsnap backup strategy. 20230317 pho@freebsd.org # Keep 4 monthly, 4 weekly and 6 daily backups # Handles missing backup days set -eu [ $# -eq 1 ] && now=$1 || now=`date +%s` months=`date -u -j -f '%s' '+%Y%m' $now` ndaily=6 # keep 6 daily backups nmonthly=4 # Keep 4 monthly backups nweekly=4 # Keep 4 weekly backups paths=/Users/pho/work # List of directories to backup prefix="" # backup file prefix re='\d{8}T\d{6}W\d{2}' # filename search pattern tarsnap="/opt/local/bin/tarsnap --keyfile /var/root/tarsnap.key --cachedir /opt/local/tarsnap-cache" tag=`date -j -f '%s' '+%Y%m%dT%H%M%SW%V' $now` today=`date -j -f '%s' '+%Y%m%d' $now` week=`date -j -f '%s' '+%V' $now` # 1 - 53 echo "`date` Start of daily backup" # Get a sorted list of the old backups. Newest first list=`$tarsnap --list-archives | grep -E "$re" | sort -rn` echo "$list" | grep -q $today && { echo "`date` Backup has already been run today"; exit 1; } file=$prefix$tag.daily echo "$list" | grep weekly | grep -q "W$week" || file=$prefix$tag.weekly echo "$list" | grep monthly | grep -q $months || file=$prefix$tag.monthly $tarsnap -c -f $file $paths || exit 2 # Remove old backups list=`$tarsnap --list-archives | grep -E "$re" | sort -rn` # daily n=`echo "$list" | grep "daily" | wc -l` j=1 for i in `echo "$list" | grep "daily"`; do if [ $j -gt $ndaily ]; then echo rm $i $tarsnap -d -f $i fi j=$((j + 1)) done # weekly n=`echo "$list" | grep "weekly" | wc -l` j=1 for i in `echo "$list" | grep "weekly"`; do if [ $j -gt $nweekly ]; then echo rm $i $tarsnap -d -f $i fi j=$((j + 1)) done # monthly n=`echo "$list" | grep "monthly" | wc -l` j=1 for i in `echo "$list" | grep "monthly"`; do if [ $j -gt $nmonthly ]; then echo rm $i $tarsnap -d -f $i fi j=$((j + 1)) done list=`$tarsnap --list-archives | grep -E "$re" | sort -rn` echo echo "Current backups:" echo $list | tr ' ' '\n' | grep daily echo echo $list | tr ' ' '\n' | grep weekly echo echo $list | tr ' ' '\n' | grep monthly echo "`date` $file completed" exit 0