summaryrefslogtreecommitdiff
path: root/remove-old-backups.in
diff options
context:
space:
mode:
Diffstat (limited to 'remove-old-backups.in')
-rwxr-xr-xremove-old-backups.in79
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