diff options
Diffstat (limited to 'remove-old-backups.in')
-rwxr-xr-x | remove-old-backups.in | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/remove-old-backups.in b/remove-old-backups.in new file mode 100755 index 0000000..c931409 --- /dev/null +++ b/remove-old-backups.in @@ -0,0 +1,79 @@ +#!/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 |