#!/bin/sh usage() { echo "Usage: $0 [-nv] [[[user@]host:]dir] $0 removes old backups and keeps: - backups for the current day - 1 backup per past day for the current month - 1 backup per past month for the current year - 1 backup per past year Options: -n dry run -v verbose Environment variables: - BACKUP - backup directory" } while getopts :nv opt; do case $opt in (n) optn=echo ;; (v) optv=-t ;; (*) usage; exit 1 ;; esac done shift $((OPTIND -1)) BACKUP=${1:-$BACKUP} [ "$BACKUP" ] || { usage; exit 1; } host=${BACKUP%:*} dir=${BACKUP#*:} ls='ls -r' rm="xargs -r $optv $optn rm -rf" [ "$host" = "$dir" ] || ls="ssh $host $ls" rm="ssh $host $rm" echo "# Cleaning backups on $BACKUP" $ls "$dir" | awk -v now=$(date +%Y-%m-%d) -v dir="$dir" ' BEGIN { yn = substr(now, 1, 4) # Year now mn = substr(now, 6, 2) # Month now dn = substr(now, 9, 2) # Day now } { yb = substr($0, 1, 4) # Year backup mb = substr($0, 6, 2) # Month backup db = substr($0, 9, 2) # Day backup $0 = dir "/" $0 dy = yn - yb dm = dy * 12 + mn - mb # if (yb != yn) { if (dm > 12) { if (yb in yearly) print; else yearly[yb] = 1 next } # if (mb != mn) { dd = dm * 30 + dn - db if (dd > 30) { if (mb in monthly) print; else monthly[mb] = 1 next } if (db != dn) { if (db in dayly) print; else dayly[db] = 1 } }' | $rm