Einfaches Backup aller Fotos mit PowerShell zu Amazon Photos

Ich mache Fotos - ziemlich viele Fotos. Nicht nur im Rahmen meiner fotografischen beruflichen Tätigkeit, sondern auch mit dem Handy. Mein Archiv ist aktuell 13TB - und die drei mal gespeichert. Und nachdem mein Archiv (neben den Negativen, die ich übrigens auch gescannt digital habe) mein wichtigstes Asset ist, darf mir dieses nicht verloren gehen.

Wer nach einer einfachen Methode sucht, seine Fotos aus dem Apple Universum rauszubekommen (ohne mühsame Umwege und die auch mit 50.000 Fotos+ funktioniert), dem sei mein Blogpost hierzu angeraten.

Klassisch: Die 3-2-1 Backup Regel

In meiner bisherigen Struktur für Backups befolge ich die 3-2-1 Regel und bin damit bisher recht gut gefahren. Drei Kopien auf zwei unterschiedlichen Devices/Speichermedien und eine Kopie offsite bzw. in der Cloud. Platten- und sogar NAS-Ausfälle konnte ich damit über die Jahre gut überstehen. Trotzdem habe ich mir aus unterschiedlichen Gründen eine weitere Schiene überlegt…

Die nächste Stufe: Die 4-3-2 Regel

Vier Kopien auf drei unterschiedlichen Speichermedien und zwei davon offline. Das klingt nach viel Aufwand, ist es aber insofern nicht weil man

  1. die Kopieren automatisieren kann (mehr dazu unten) und

  2. man nicht notwendigerweise das komplette Set von Daten für die vierte Kopie speichern muss

Welche Daten sind nun in der +1 Variante gesichert? Ich habe mich dazu entschieden aus meinem Fotoarchiv nur die Daten zusätzlich zu sichern, die ich Kunden abgeliefert habe. Das sind zum einen wesentlich weniger Dateien als ich angefertigt habe und diese sind auch wesentlich kleiner, da das immer JPGs sind.

Für mein komplettes Archiv arbeite ich weiterhin mit 3-2-1.

Der Blogposttitel hat es schon verraten: die abgeliefertenJPGs sollen zusätzlich auf Amazon Photos gesichert werden. Das bringt folgende Vorteile:

  1. Ein weiterer Speicherort
    Für alle Fälle…

  2. Schutz gegen Ransomware
    Updatezyklen sind (im Gegensatz zu meinem 3-2-1 Datenfluss nicht unmittelbar (sobald sich eine Datei ändert, wird diese auch schon weitergeschoben auf die Kopien) sondern werden alle zwei Wochen upgedatet. Sollte ich Opfer von Ransomware oder ähnlicher Software werden liegen auf Amazon Photos noch mit guter Wahrscheinlichkeit meine originalen JPGs

  3. Online-Verfügbarkeit
    JPGs in Amazon Photos können von überall angesehen bzw. auch downgeloaded werden. Man hat damit also auf alle Fotos, die bearbeitet bzw. abgeliefert wurden Zugriff.

  4. Unlimitierter Speicher
    Zumindest für Fotos, eine Einschränkung, mit der wir in diesem Zusammenhang gut leben können. Hier noch eine genaue Liste, welche Dateitypen akzeptiert werden.

Organisation - Datei- und Verzeichnisstruktur

Wichtig: Die folgenden Gedanken funktionieren nur gut, wenn man sich an eine Namenskonvention gehalten hat.

Als Fotograf arbeite ich viel im Eventbereich bzw. für Firmen. Daher habe ich mich vor Jahren dazu entschieden für jeden Job/jedes Shooting einen eigenen Lightroom-Katalog zu machen. Die Kataloge liegen in einem Verzeichnis pro Jahr. Dies sieht bei mir dann zum Beispiel so aus:

Innerhalb eines solchen Folders findet sich dann folgendes:

  • Der Lightroom Katalog für das Shooting

  • Ein Verzeichnis Originals mit allen RAW und Video Dateien

  • Ein oder mehrere Verzeichnisse mit _Export im Namen - also beispielsweise zusätzlich eine kleine, stärker komprimierte Version für das Web mit _ExportWeb etc

  • Optional ein Verzeichnis Organisation mit wichtigen weiteren Infos wie Abläufe, Akkreditierungen etc. (das wird von Amazon Photos aber nicht beachtet)

Diese Standardisierung der Verzeichnisnamen ist nun vorteilhaft bei der Auswahl der zu speichernden Fotos.

Folgendes solle also auf Amazon Photos gespeichert werden:

  1. Alle JPG Dateien

  2. In den Verzeichnissen der einzelnen Jahre (2023, 2022 etc)

  3. In Unterverzeichnissen die _Export im Namen haben

  4. in genau der gleichen Struktur wie in der Quelle

Amazon Photos kann zwar automatisch ganze Verzeichnisse hochladen, aber nicht so spezifisch, wie ich meine Anforderungen hier habe. Insofern nehme ich einen Umweg und bereite auf meiner lokalen Festplatte ein eigenes Verzeichnis für Amazon vor, in dem alle Fotos hochgeladen werden sollen. Den Nachteil der doppelten JPG Dateien nur für Amazon nehme ich gerne in Kauf, da die JPG Dateien relativ klein sind und auch nur die beinhalten, die ich tatsächlich abgeliefert habe.

Say Hi! to PowerShell on macOS

Aus meiner Softwareentwicklerzeit unter Windows kommen nun meine PowerShell Kenntnisse zugute. Das folgende PowerShell script grast die entsprechenden Verzeichnisse ab und kopiert (falls nötig) die JPGs in die Amazon Photos Verzeichnisstruktur.

# main directory for photos, contains sub-directories like Pictures2023, Pictures2022 etc
$rootPhotoDir = "/Volumes/iMac External Disc 3/"

Function Copy-File {
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=0)]
        [string] $SourceFolderPath,
 
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)]        
        [string] $DestinationFolderPath,

        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)]        
        [string] $FileName
    )
 
    #Check if the Destination Folder exists
    If (-not (Test-Path $DestinationFolderPath)) {
        New-Item -ItemType Directory -Path $DestinationFolderPath | Out-Null
        Write-Host "Ensured the $DestinationFolderPath!" -f Yellow
    } 
    
    #Copy the File to Destination Folder if its not already there
    $dfn = Join-Path $DestinationFolderPath $FileName
    if(-Not (Test-Path -Path $dfn -PathType Leaf)) 
    {
        $fn = Join-Path $SourceFolderPath $FileName
        Copy-Item -Path $fn -Destination $DestinationFolderPath
        Write-Host "File $fn Has been Copied to $DestinationFolderPath" -f Green
    }
}


Function Backup-File-To-Amazon {
    [CmdletBinding()]
    Param
    (
        # The source directory, e.g. Photos2022
        [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=0)]
        [string] $SourceDirectory
    )

    $backupDir = $rootPhotoDir + $SourceDirectory + "/"
    $files = Get-Childitem -Recurse $backupDir -Exclude $exclusionList

    ForEach ($file in $files) {
        # continue for not interesting files/folders
        if ( $file -is [System.IO.DirectoryInfo] ) { continue }
        if($file.FullName.Contains(".lrdata")) { continue }
        if($file.FullName.Contains(".lrcat")) { continue }
        if($file.FullName.Contains(".DS_Store")) { continue }
        if(-not $file.FullName.EndsWith(".jpg")) { continue }
        if(-not $file.FullName.Contains("Export")) { continue }
        
        $sourcePath = $file.DirectoryName
        $backupPath = $file.DirectoryName.Replace($backupDir, "/Volumes/iMac External Disc 3/AmazonPhotosBackup/$sourceDirectory/")

        Copy-File -SourceFolderPath $sourcePath -DestinationFolderPath $backupPath -FileName $file.Name
    }
}

Backup-File-To-Amazon "Pictures2023"



Sieht nach viel Code aus (tut es bei PowerShell immer), ist aber im Grunde einfach: ein gegebenes Verzeichnis wird rekursiv duchlaufen und kopiert alle gefundenen JPG Dateien, sofern im Export Verzeichnis liegend, in das Verzeichnis, das Amazon Photos regelmäßig backupt.

Bei mir sind in dem Verzeichnis aktuell 140GB und der initiale Upload dauerte ca. 13 Stunden.

Das Script selbst wird am besten mit Visual Studio Code bearbeitet/getestet:

Play it again, Sam! - Das Backup regelmäßig updaten

In meiner Backupstruktur ist nichts manuell - sonst würde ich das bei der ersten möglichen Gelegenheit vergessen… Daher muss dieses Script nun noch regelmäßig ausgeführt werden. Da nur neue JPG Dateien kopiert werden ist ein täglicher Lauf kein Aufwand, da die meisten Dateien schon gesichert wurden. Auf macOS gibt es den launchd dafür.

Einschränkungen und weitere Überlegungen

Warum nicht Dropbox, Google Drive etc?

Ähnlich zu Amazon Photos kann man seine JPGs auch auf Dropbox, Google Drive oder ähnliches legen. Hier sind aber, abhängig von den Datenmengen, bald zusätzliche Kosten damit verbunden - Amazon Photos ist für JPGs und RAWs aktuell unlimitiert. Dafür könnte man auf Dropbox oder Google Drive zusätzliche, wichtige Dateien wie PDFs mitsichern.

Warum PowerShell und nicht ein Shellscript oder Python?

Das ginge natürlich ebenso - einfach das nehmen, mit dem man am schnellsten zum Ziel kommt ;)

Warum nicht mit dafür gedachter Software wie CCC (Carbon Copy Cloner) arbeiten?

Die Requirements waren so speziell, dass eine Script-basierte Lösung die flexibelste erschien. Und sie kostet keine Lizenzkosten (wiewohl ich CCC für meine sonstigen 3-2-1 Backups verwende)


Was ist mit Fotos vom Handy?

Gute Frage, die könnten ebenfalls zusätzlich auf Amazon Photos gespeichert werden. Da ich auf dem iPhone allerdings HEIC als Format eingestellt habe, müsste ich die zuerst konvertieren. Guter Content für einen weiteren Blogpost … ;)

Fragen zu Backup-Themen? Unter macOS oder Windows? Unklarheiten bei Lightroom oder der Bildverwaltung?

Gerne einfach melden, ich beschäftige mich mit dem Thema seit 2011 und meine Skills als Softwareentwickler und Techniker sind in dem Bereich oftmals hilfreich ;)

Michael SeirerComment