Backup. Stress down.

Here’s a backup shell script to drop into your Linux based server. It backs up and rotates file names.

I wanted something simple but powerful. This file just requires the ubiquitous date command – likely present in all systems – but will keep enough backups to cover most situations. One per month over 12 month rotation, one per week over five week rotation, and one per day over a seven day rotation.

The code simply uses the fact that the days and months change in a predictable way. For instance Monday comes around every seven days, so a file called Monday will be replaced every seven days if we try to save another file called Monday, as with all the days, simply replacing older files.

It’s on my BitBucket here:
https://bitbucket.org/akademy/backup-script/src/master/
which you can check out for more details. But also see the code below.

backup_rotate_store () {

	local usage
	usage="Usage: 'backup_rotate_store <directory> <original_filename>'.
The original file should be in <directory>. Pass in the current name of the file."

	# Check for parameter $1
	if [ -z "$1" ]
	then
		echo "First parameter not set to a directory"
		echo "${usage}"
		return 1
	fi

	# Check for parameter $2
	if [ -z "$2" ]
	then
		echo "Second parameter not set to original filename"
		echo "${usage}"
		return 1
	fi

	local directory
	directory=$1
	local original_filename
	original_filename=$2

	local DAY
	DAY=$(date +%A)

	# Day backupds (Sunday, Monday, etc.)
	mv "${directory}/${original_filename}" "${directory}/${DAY}.${original_filename}"

	local DATE=
	DATE=$(date +%d)
	if (( $DATE == 1 || $DATE == 8 || $DATE == 15 || $DATE == 22 || $DATE == 28 )); then

		local EXTENSION
		EXTENSION='th'
		if (( $DATE == 1 )); then
			EXTENSION='st'
		fi
		if (( $DATE ==22 )); then
			EXTENSION='nd'
		fi

		# Weeks backup (1st, 7th, etc.)
		cp --archive "${directory}/${DAY}.${original_filename}" "${directory}/${DATE}${EXTENSION}.${original_filename}"

		if (( $DATE == 28 )); then
			local MONTH
			MONTH=$(date +%B)

			# Months backup (January, February, etc.)
			cp --archive "${directory}/${DAY}.${original_filename}" "${directory}/${MONTH}.${original_filename}"
		fi

	fi
}

To use it, just move the file to backup to where it should be stored then call the function. e.g.:

echo "My backup testfile" > testfile

DEST=/data/backups
FILENAME=testfile.txt

mv testfile "${DEST}/${FILENAME}"

backup_rotate_store ${DEST} ${FILENAME}

Enjoy, and may it bring you luck.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.