Skip to content

Instantly share code, notes, and snippets.

@phcorp
Last active February 3, 2024 13:18
Show Gist options
  • Save phcorp/659956c9f52af73483dbf0c65b1aa966 to your computer and use it in GitHub Desktop.
Save phcorp/659956c9f52af73483dbf0c65b1aa966 to your computer and use it in GitHub Desktop.
Backup files cleaning script
#!/bin/bash
##############################################################################
# This script is meant to be run once a day.
#
# Backup files name format must be: database-%Y-%m-%dT%H:%M.bz2
#
# It deletes backup files that does not match one of these conditions:
# - backup every 15 minutes during one week
# - backup every day during 3 months
# - backup every week during 1 year
#
##############################################################################
# Import parameters
current_directory="$(dirname $([ -L $0 ] && readlink -f $0 || echo $0))"
. "$current_directory/parameters.sh"
set -x
# Define variables
DELETE_SCRIPT="$current_directory/backup-delete.sh"
LAST_WEEK=$(date -d "1 week ago" +%Y%m%d%H%M)
LAST_THREE_MONTHS=$(date -d "3 months ago" +%Y%m%d%H%M)
LAST_YEAR=$(date -d "1 year ago" +%Y%m%d%H%M)
# Do deletion
FILES=$(ssh $parameters_backup_user@$parameters_backup_host "ls -1 $parameters_backup_path")
echo "$FILES" | while read line; do
# extract date from filename
# ie: database-2017-10-26T12:20.bz2 → 201710261220
DATE=$(echo $line | sed 's/database-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)T\([0-9]\{2\}\):\([0-9]\{2\}\).bz2/\1\2\3\4\5/g')
KEEP_DAY=$(echo $line | sed 's/database-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)T\([0-9]\{2\}\):\([0-9]\{2\}\).bz2/\1\2\30000/g')
DAY_OF_WEEK=$(echo $line | sed 's/database-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)T\([0-9]\{2\}\):\([0-9]\{2\}\).bz2/\1-\2-\3 \4:\5/g' | date +%u --date=$1)
# delete backups older than one year ago
if [[ "$DATE" < "$LAST_YEAR" ]]; then
$DELETE_SCRIPT $line
fi
# delete backups within last year that did not occur a monday
if [[ "$DATE" > "$LAST_YEAR" ]] && [[ "$DATE" < "$LAST_THREE_MONTHS" ]] && [[ "$DAY_OF_WEEK" != "1" ]]; then
$DELETE_SCRIPT $line
fi
# delete backups within 3 months that did not occur at midnight
if [[ "$DATE" > "$LAST_THREE_MONTHS" ]] && [[ "$DATE" < "$LAST_WEEK" ]] && [[ "$DATE" != "$KEEP_DAY" ]]; then
$DELETE_SCRIPT $line
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment