Skip to content

Instantly share code, notes, and snippets.

@bigbosst
Created August 6, 2019 14:09
Show Gist options
  • Save bigbosst/083f1f397b836b3a299b7ec1b114e7ed to your computer and use it in GitHub Desktop.
Save bigbosst/083f1f397b836b3a299b7ec1b114e7ed to your computer and use it in GitHub Desktop.
A simple rotational backup script that will rotate daily, weekly, monthly, and yearly backups.
#!/bin/bash
SRC_DIR="/var/www/html"
BACKUP_DIR="/mnt/backups"
PROJECT_NAME="project"
BACKUP_RETENTION_DAILY=6
BACKUP_RETENTION_WEEKLY=3
BACKUP_RETENTION_MONTHLY=3
BACKUP_RETENTION_YEARLY=0
DAYYEAR=`date +%j`
DAYMONTH=`date +%d`
DAYWEEK=`date +%u`
if [[ ( $DAYYEAR -eq 1 ) ]];
then
FN='yearly'
elif [[ ( $DAYMONTH -eq 1 ) ]];
then
FN='monthly'
elif [[ ( $DAYWEEK -eq 7 ) ]];
then
FN='weekly'
elif [[ ( $DAYWEEK -lt 7 ) ]];
then
FN='daily'
fi
DATE=$FN-`date +"%Y%m%d"`
echo $DATE
function show_help {
echo "BackupRotation available options are"
echo
echo "-s Sorce directroy to be backed up"
echo "-b Destination forlder for the backups"
echo "-n Name of the project being backuped"
echo "-d Number of Daily backups to keep, negitve numbers will disable"
echo "-w Number of Weekly backups to keep, negitve numbers will disable"
echo "-m Number of Monthly backups to keep, negitve numbers will disable"
echo "-y Number of Yearly backups to keep, negitve numbers will disable"
echo "-h show this help text"
}
function backup
{
tar czf $BACKUP_DIR/$PROJECT_NAME-$DATE.tar.gz $SRC_DIR
cd $BACKUP_DIR/
echo "Rotating old backups"
ls -t | grep $PROJECT_NAME | grep daily | sed -e 1,"$BACKUP_RETENTION_DAILY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $PROJECT_NAME | grep weekly | sed -e 1,"$BACKUP_RETENTION_WEEKLY"d | xargs -d '\n' rm -R > /dev/null 2>&1
ls -t | grep $PROJECT_NAME | grep monthly | sed -e 1,"$BACKUP_RETENTION_MONTHLY"d | xargs -d '\n' rm -R > /dev/null 2>&1
if [[ ( $BACKUP_RETENTION_YEARLY -gt 0 ) ]]; then
ls -t | grep $PROJECT_NAME | grep htdocs | grep yearly | sed -e 1,"$BACKUP_RETENTION_YEARLY"d | xargs -d '\n' rm -R > /dev/null 2>&1
fi
}
while getopts s:b:n:d:w:m:y:h option
do
case "${option}"
in
s) SRC_DIR=${OPTARG};;
b) BACKUP_DIR=${OPTARG};;
n) PROJECT_NAME=${OPTARG};;
d) BACKUP_RETENTION_DAILY=${OPTARG};;
w) BACKUP_RETENTION_WEEKLY=${OPTARG};;
m) BACKUP_RETENTION_MONTHLY=${OPTARG};;
y) BACKUP_RETENTION_YEARLY=${OPTARG};;
h) show_help
exit 0
;;
esac
done
echo $BACKUP_RETENTION_DAILY
if [[ ( $BACKUP_RETENTION_DAILY -gt 0 ) && ( ! -z "$BACKUP_RETENTION_DAILY" ) && ( $BACKUP_RETENTION_DAILY -ne 0 ) && ( $FN == daily ) ]]; then
echo "Daily Backup Run"
backup
fi
echo $BACKUP_RETENTION_WEEKLY
if [[ ( $BACKUP_RETENTION_WEEKLY -gt 0 ) && ( ! -z "$BACKUP_RETENTION_WEEKLY" ) && ( $BACKUP_RETENTION_WEEKLY -ne 0 ) && ( $FN == weekly ) ]]; then
echo "Weekly Backup Run"
backup
fi
echo $BACKUP_RETENTION_MONTHLY
if [[ ( $BACKUP_RETENTION_MONTHLY -gt 0 ) && ( ! -z "$BACKUP_RETENTION_MONTHLY" ) && ( $BACKUP_RETENTION_MONTHLY -ne 0 ) && ( $FN == monthly ) ]]; then
echo "Monthly Backup Run"
backup
fi
echo $BACKUP_RETENTION_YEARLY
if [[ ( $BACKUP_RETENTION_YEARLY -ge 0 ) && ( ! -z "$BACKUP_RETENTION_YEARLY" ) && ( $FN == yearly ) ]]; then
echo "Yearly Backup Run"
backup
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment