summaryrefslogtreecommitdiff
path: root/scriptlets/backup_rotation.sh
blob: 891933a964621e13a2215120270c07634b72c6c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

BACKUP_ROOT="/home/jay/Downloads/Snapshots"
BACKUP_REGEX='.*[0-9]+-[0-9]+-[0-9]+_[0-9]+:[0-9]+:[0-9]+'
RETAIN_NUM=30

[[ ! -d "$BACKUP_ROOT" ]] && echo "[$(date '+%Y-%m-%d_%H:%M:%S')] ERROR. Root backup directory '$BACKUP_ROOT' not found. Exiting..." && exit -1

BACKUP_SITES=()
while IFS=  read -r -d $'\0'; do
    BACKUP_SITES+=("$REPLY")
done < <(find "$BACKUP_ROOT" -maxdepth 1 -mindepth 1 -type d -print0)

[[ ${#BACKUP_SITES[@]} -eq 0 ]] && echo "[$(date '+%Y-%m-%d_%H:%M:%S')] Error. No backup sites found in root directory '$BACKUP_ROOT'. Exiting..." && exit -1

for SITE in ${BACKUP_SITES[@]}; do

    TOTAL_NUM=$(ls -1 "$SITE" | grep -cE "$BACKUP_REGEX")
    DELETE_NUM=$((TOTAL_NUM - RETAIN_NUM))

    if [ $DELETE_NUM -gt 0 ]; then

        old_backups=$(ls -1 "$SITE" | grep -E "$BACKUP_REGEX" | sort | head -n $DELETE_NUM)
        for old_backup in ${old_backups[@]}; do
            rm -rf "$SITE/$old_backup"
            echo "[$(date '+%Y-%m-%d_%H:%M:%S')] Removed old backup: $SITE/$old_backup"
        done
    else
        echo "[$(date '+%Y-%m-%d_%H:%M:%S')] Amount of stored backups in '$SITE' does not exceed retention policy [$RETAIN_NUM]. No old backups removed"
    fi
done