#!/bin/bash # remove-old-backups version #VERSION# [ -r "#ETCDIR#/backup.conf" ] && \ . "#ETCDIR#/backup.conf" usage () { >&2 echo \ 'Usage: remove-old-backups [-n] Remove backups older than one year, keeping only one backup per month. Options: #HELPTEXT# # -n only print what would be removed' [ -n "$1" ] && exit $1 exit 1 } no_action=false if [ $# -eq 1 ] then if [ "x$1" == 'x--help' ] then usage 0 elif [ "x$1" == 'x--version' ] then >&2 echo '#VERSION#' exit 0 elif [ "x$1" == 'x-n' ] then no_action=true else usage fi elif [ $# -gt 1 ] then usage fi backups=$( printf '%s\n' "${backups[@]}" | \ cut -d' ' -f1 | \ while read -r dir; do \ if [ $(ls "$dir" | wc -l) -lt 30 ]; then continue; fi ls -1 "$dir" | \ sed -n ' s,^\([0-9]\{4\}\)_\([0-9]\{2\}\)_\([0-9]\{2\}\)$,'"${dir}"'\0 \3 \2 \1 '"${dir}"', T p ' done ) { printf '%s\n' "${backups}" | \ sort -k5,5 -k4,4 -k3,3 -k2,2 -k1,1 | \ uniq -f2 printf '%s\n' "${backups}" | \ sed "$( for dist in $(seq 0 20 365); do printf '/ %s \S\+$/p\n' \ "$(date '+%m %Y' -d@$(($(date +%s)-24*60*60*${dist})))" done | \ sort -u )" } | \ cut -d' ' -f1 | \ sort | \ uniq -u | \ while read -r dir; do echo rm -rf --one-file-system "${dir}" if ! ${no_action}; then rm -rf --one-file-system "${dir}" fi done