This script relies on Folder Actions to fire it once it is attached to /Volumes and the appropriately named hard drive is plugged in. I use it to update my off-site photo backup drive.
Settings in the script are commented with instructions, which are hopefully clear enough. It does mention iPhoto, because it was written when iPhoto was a thing. A good thing, a great thing even. Now… *meh*
The options for rsync are fairly standard (recursive, preserve times, extended attributes, and skip files already on the backup). The path to rsync is from OS X shipping with a version of rsync that was unbearably slow and me installing a newer version. I’m not sure when Apple ditched the older rsync version, but it sure wasn’t soon enough. I’m leaving it here for example purposes, but this script will fail if you don’t have an rsync binary there.
-- The name of the physical disk.
property top_drive : "Portable HDD"
-- The name of the disk image file.
-- If it is beyond root of top_drive, the (non-POSIX) path will need to be added. ie "backups:iPhoto backup.dmg"
property iPhoto_dmg : "Photos backup.sparseimage"
-- The name of the disk image drive.
property iPhoto_drive : "Photos backup"
-- POSIX path to iPhoto Library (Default is ~/Pictures/iPhoto Library).
property iPhoto_lib : quoted form of (POSIX path of ((path to pictures folder) as text) & "Photos Library.photoslibrary")
-- rsync options
property rsync_options : "-rtE --ignore-existing"
-- Path to rsync binary.
property rsync_path : "/usr/local/bin/" -- Leave blank ("") if not using a user installed version of rsync.
on logErr(the_msg, the_num)
	do shell script "logger '" & "iPhoto backup: " & the_msg & " (" & the_num & ")'"
end logErr
on adding folder items to this_folder after receiving added_items
	set new_item to item 1 of added_items as text
	if new_item is (top_drive & ":") then
		tell application "Finder"
			try
				open top_drive & ":" & iPhoto_dmg as alias
				delay 10
			on error errMsg number errNum
				my logErr(errMsg, errNum)
			end try
		end tell
		set n to 0
		try
			set rsync_options to rsync_options & " "
			repeat until n = 10
				tell application "Finder" to set all_drives to name of every disk
				if iPhoto_drive is in all_drives then
					set start_time to current date
					set rsync_it to (do shell script rsync_path & "rsync " & rsync_options & iPhoto_lib & " " & quoted form of ("/Volumes/" & iPhoto_drive))
					set total_time to (current date) - start_time
					my logErr("Done", "" & total_time & " sec")
					exit repeat
				else
					delay 6
					set n to n + 1
				end if
			end repeat
			tell application "Finder" to eject disk iPhoto_drive
			display dialog "iPhoto backup complete." & return & return & "You may now eject the disk \"" & top_drive & "\"." with icon 2
		on error errMsg number errNum
			my logErr(errMsg, errNum)
			display dialog "Oops! An error occurred. :(" & return & return & errNum & " : " & errMsg with icon 0
		end try
	end if
end adding folder items to