#!/bin/sh
#
# Use rsync and hard links to perform incremental backups
#
# Usage:
#   incremental_rsync.sh <Source folders/files> <Destination folder>

if [ $# -lt 2 ]; then
   echo "Usage:";
   echo "    $0 <Source(s)> <Destination folder>";
   exit 1;
fi;

while [ "$1" -a $# -gt 1 ]; do
   RSYNC_SOURCE_PATHS="$RSYNC_SOURCE_PATHS $1";
   shift;
done;

DESTINATION_FOLDER=$1;

NEW_BACKUP="Backup."$(date +%Y%m%d);
   
# Find last backup (i.e. the last one in the folder)
for backup in "$DESTINATION_FOLDER"/Backup.*; do
   LAST_BACKUP=$backup;
done;
   
if [ ! "$LAST_BACKUP" ]; then
   # Create first backup
   echo "mkdir -p \"$DESTINATION_FOLDER/$NEW_BACKUP\" || exit 1";
   mkdir -p "$DESTINATION_FOLDER/$NEW_BACKUP" || exit 1;
   echo "rsync -az $RSYNC_SOURCE_PATHS \"$DESTINATION_FOLDER/$NEW_BACKUP\"";
   rsync -az $RSYNC_SOURCE_PATHS "$DESTINATION_FOLDER/$NEW_BACKUP";
else
   NEW_BACKUP_=$NEW_BACKUP;
   count=1;
   while [ -e "$DESTINATION_FOLDER/$NEW_BACKUP" ]; do
      NEW_BACKUP=$NEW_BACKUP_$count;
      count=$(($count+1));
   done;

   # Create hard link from last backup to new one
   echo "mkdir -p \"$DESTINATION_FOLDER/$NEW_BACKUP\" || exit 1";
   mkdir -p "$DESTINATION_FOLDER/$NEW_BACKUP" || exit 1;
   olddir=`pwd`
   echo "cd \"$LAST_BACKUP\"";
   cd "$LAST_BACKUP";
   echo "find . -print | cpio -pdl \"$DESTINATION_FOLDER/$NEW_BACKUP\"";
   find . -print | cpio -pdl "$DESTINATION_FOLDER/$NEW_BACKUP";
   echo "cd \"$olddir\"";
   cd "$olddir";
   echo "touch \"$DESTINATION_FOLDER/$NEW_BACKUP\"";
   touch "$DESTINATION_FOLDER/$NEW_BACKUP";
   
   # Perform rsync
   echo "rsync -az --delete $RSYNC_SOURCE_PATHS \"$DESTINATION_FOLDER/$NEW_BACKUP\"";
   rsync -az --delete $RSYNC_SOURCE_PATHS "$DESTINATION_FOLDER/$NEW_BACKUP";
fi;
