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