Automatisches Backup von FAT32 USB Sticks auf dem Mac
Leider unterstützt die hervorragende Backuplösung von Apple – Time Maschine – keine FAT32 formatierten USB Sticks als Quellmedien. Gerade bei diesen kleinen Dingern ist die Wahrscheinlichkeit eines Verlustes jedoch besonders hoch, weshalb man entweder gar keine kritischen Daten darauf speichern, oder regelmäßig Backups erstellen sollte.
Mein Ziel: Bei jedem Anstecken des USB Sticks wird der gesamte Inhalt automatisch via AppleScript und rSync auf ein Verzeichnis auf meinen Mac kopiert. Vor korrupten Dateien schützt mich dann das automatische Time Maschine Backup.
Ich bin natürlich nicht der erste, der sich mit der Thematik befasst. Im Internet fand zwei etwas angestaubte Einträge, einer beschrieb eine Lösung mit AppleScript und dem Tool “Do Something When” [Link1], der andere mit einer FolderAction im Volumes Verzeichnis und einem Script auf jedem USB Stick [Link2]. Wem meine Lösung nicht gefällt, der wird eventuell dort glücklich.
Der Ansatz mit der FolderAction und einem Script auf dem USB Stick gefällt mir am besten. Allerdings habe ich das Script ein wenig für meine Bedürfnisse angepasst, da ich das Archivieren der Daten im Endeffekt Time Maschine überlassen möchte. Ausserdem habe ich eine Abfrage eingebaut, denn das Script startet in der ursprünglichen Form beim Anschließen eines Datenträgers ohne Rückfrage das Script rsync.app vom Stick, was Sicherheitstechnisch bedenklich ist.
Also folgend meine Lösung: (Der Code wurde größtenteils von hier kopiert und modifiziert)
Teil 1: Das Folderaction Script:
property backup_script : "rsync.app" (* add/change this string to match the name of your script *) on adding folder items to this_folder after receiving these_volumes tell application "Finder" try set the volume_list to every file of this_folder (* go through all entries in /Volumes/ *) repeat with i from 1 to number of items in volume_list set this_item to the original item of item i of volume_list if the kind of this_item is "Volume" then set this_disk to (this_item as alias) (* is this item the newly mounted disk? *) if this_disk is in these_volumes then (* iterate through all files in the root of disk *) set searchCmd to "ls -d " & quoted form of POSIX path of this_disk & backup_script (* check to see if a backup script is available *) set searchResult to "" try set searchResult to do shell script searchCmd end try (* run the backup script *) if (searchResult starts with "/Volumes") then set backupFile to POSIX file searchResult as alias display dialog "Backupscript auf Volume gefunden, backup ausführen?" buttons {"JA", "NEIN"} default button 2 with icon stop if button returned of result is "NEIN" then return open backupFile end if end if end if end repeat on error error_message number error_number if the error_number is not -128 then display dialog error_message buttons {"OK"} default button 1 end if end try end tell end adding folder items to |
1. Kopiere das Script in den Script Editor
2. Speichern als… “Script” unter /Library/Scripts/Folder Action Scripts/
3.- Mit 10.6 und folgenden: Öffne im Finder die Systempartition
Rechtsklicke auf /Volumes und wähle im Kontextmenü Folder Action Setup
– Mit 10.5 und früher: Öffne den Finder und wähle Gehe zu Ordner > /Volumes/
Öffne Folder Actions Setup (aus dem Dienstprogrammen)
Dragge das Ordnericon aus der Titelleiste des Finder Fensters auf das geöffnete Formular und klicke OK
4. Wähle im Dialogfenster das gespeicherte Script aus.
Teil 2: Das Script auf dem Datenträger
property display_notification : false property backup_target : "Documents/Backups/" (* MUST be a folder location with trailing slash! Always relative to home folder *) property rsync_params : "-aEz --delete-excluded" (* END OF PREFERENCES *) set WhereImRunningFrom to path to me tell application "Finder" (* NEVER run from the hard drive! comment: nice feature, thats why it stays!*) set bootVolume to name of disk of home (* safety feature! *) set NameOfDisk to name of disk of WhereImRunningFrom if NameOfDisk is bootVolume then beep display alert "Should not run this script from the boot volume!" return end if (* setup backup dir *) set homeDir to path to home folder from user domain set backup_folder to POSIX path of homeDir & backup_target try (* quick and dirty check to see if folder exists - must be a good way to do this in applescript? *) do shell script "cd " & backup_folder on error try do shell script "mkdir " & backup_folder on error display alert "There was an error creating the backup folder " & backup_folder return end try end try (* find source and target *) set backupBase to NameOfDisk & "-Backup" set targetDir to backup_folder & quoted form of backupBase set sourceDir to quoted form of ("/Volumes/" & NameOfDisk & "/") end tell (* do the backup *) set excluded to " --exclude='.Trash*' --exclude='.Spotlight*' " set theScript to "rsync " & rsync_params & excluded & sourceDir & " " & targetDir & "; touch " & targetDir do shell script theScript activate of me beep if display_notification then display alert NameOfDisk & " drive backed up" |
1. Kopiere das Script in den Script Editor
2. Ändere die Konstante backup_targets, beachte dass das Script keine Adminrechte hat und deshalb nur in den Benutzerordner speichern kann!
3. Speichere das Script auf dem USB Stick als Application mit dem Namen rsync.app (oder dem Namen, der im anderen Script angegeben ist).
4. Teste ob es funktioniert! Beim erneuten Anschließen des USB Sticks sollte eine Warnung erscheinen, die fragt ob ein Backup erstellt werden soll.