#!/bin/bash ############################################################################### ### Release notes ############################################################################### # Title: rsync incremental backup script (LOCAL) # version: 2008-07-27 # License: GnuGPL v2 # # Description: The script is used to make LOCAL incremental backups of one # directory. Note, in this version only LOCAL2LOCAL is supported! # # Author: Per Lasse Baasch (c) # Website: http://www.skycube.net # # Requirements: rsync # # Sample Usage: ./rsync_backup_v2.sh /home/sampleuser /media/usbbackup/backup # # ToDo: - Remote RUN # - LifeTime (Timeout where old backups automaticly will be deleted) # - Exclude files and folders # ############################################################################### ### Configuration ############################################################################### # Source directory MUST ALLREADY EXIST DIRA="$1" # Destination directory MUST ALLREADY EXIST DIRB="$2" ############################################################################### ### Don't change anything below this line if you don't have errors! ############################################################################### # Path to rsync RSYNC=/usr/bin/rsync # File for the logs LOGFILE="rsynctransfer.log" # File to save name of last backup CURRENTSTATEFILE="currentstate.txt" # START the timer TIMER1=`date +%s` # Check if the currentstate exist else, create it TESTCURRENTFILE=`ls $DIRB/ | grep $CURRENTSTATEFILE` if [ "$TESTCURRENTFILE" != "$CURRENTSTATEFILE" ] then tty=`echo empty > $DIRB/$CURRENTSTATEFILE` mkdir $DIRB/empty tty=`echo nolog > $DIRB/empty/$LOGFILE` fi # Get the old backup directory OLDBACKUPDIR=`cat $DIRB/$CURRENTSTATEFILE` # Set the new backup directory NEWBACKUPDIR=`date +%F_%H-%M-%S` # Temporary directory on destination TMP=$DIRB/TMP # rsync options # -o // preserve owner (root only) # -g // preserve group # -p // preserve permissions # -t // preserve times # -r // recurse into directories # -l // copy symlinks as symlinks # -c // always checksum # -v // increase verbosity # --delete // delete files that don't exist on sender # --force // force deletion of dirs even if not empty # --backup // make backups # --backup-dir // make backups into this directory # --ignore-errors // delete even if there are I/O errors OPTIONS="-ogptrlcv --delete --force --backup --backup-dir=$TMP --ignore-errors" # --exclude=vms/" # Create TMP directory for deleted files mkdir $TMP # Create new logfile tty=`echo Start of rsynctransfer logfile > $DIRB/$LOGFILE` # Execute the rsync # sync the old backup state with the new state # and backup deleted files to the TMP directory tty=`echo -------------------------------------------- >> $DIRB/$LOGFILE` tty=`echo STARTING BACKUP WITH THE NAME $NEWBACKUPDIR >> $DIRB/$LOGFILE` $RSYNC $OPTIONS $DIRA $DIRB/$OLDBACKUPDIR >> $DIRB/$LOGFILE tty=`echo END OF BACKUP WITH THE NAME $NEWBACKUPDIR >> $DIRB/$LOGFILE` # Rename old backup directory to new backup directory mv $DIRB/$OLDBACKUPDIR $DIRB/$NEWBACKUPDIR # Rename TMP directory to oldbackup mv $TMP $DIRB/$OLDBACKUPDIR # Move logfiles to the correct directories mv $DIRB/$NEWBACKUPDIR/$LOGFILE $DIRB/$OLDBACKUPDIR/ mv $DIRB/$LOGFILE $DIRB/$NEWBACKUPDIR/ # Write file with the name of current state tty=`echo $NEWBACKUPDIR > $DIRB/$CURRENTSTATEFILE` # Delete the directory "empty" after FIRST run EMPTY=`ls $DIRB/ | grep empty` if [ "$EMPTY" = "empty" ] then rm -fr $DIRB/empty fi # STOP the timer TIMER2=`date +%s` # Calculate timer result let TIMER=$TIMER2-$TIMER1 # Get human readable result, print it and save it to the log HOURS='0' MINUTES='0' while [ $TIMER -gt 59 ]; do if [ $TIMER -ge 3600 ]; then let HOURS=HOURS+1; let TIMER=TIMER-3600; else let MINUTES=MINUTES+1; let TIMER=TIMER-60; fi done TIMERRESULT="DURATION OF BACKUP: $HOURS hours $MINUTES minutes $TIMER seconds" echo $TIMERRESULT tty=`echo $TIMERRESULT >> $DIRB/$NEWBACKUPDIR/$LOGFILE`