Das Tool rsync ist ein mächtiger Begleiter, der für viele Zwecke eingesetzt werden kann. Allerdings erschließt sich die korrekte Benutzung nicht jedem gleich – speziell wenn es um das Synchronisieren von nur bestimmten Inhalten geht. Ich habe schon öfter Skripte gesehen, die zunächst den gesamten Verzeichnisbaum von der Quelle kopieren und dann via find -exec rm… die unerwünschten Dateien und Ordner wieder entfernen. Dies ist nicht nur ineffizient, sondern auch potentiell gefährlich, weil man im Falle einer Unterbrechung nie genau den Status der Zieldaten kennt. Ich möchte hier anhand eines kleinen Beispiels die korrekte Verwendung der Exclude-Funktion von rsync vorstellen.

Im Beispiel soll eine umfangreiche Fotosammlung von mehreren hundert Gigabyte auf ein zweites, kleineres NAS-Gerät dupliziert werden, jedoch mit folgenden Anforderungen:

  1. Um Speicherplatz und Bandbreite zu sparen, sollen nur die JPG-Dateien, nicht jedoch die großen RAW-Dateien dupliziert werden.
  2. Ebenfalls sollen die unnötigen Thumbnail-Verzeichnisse des Synologie-NAS nicht berücksichtigt werden.
  3. Änderungen des Quell-NAS sollen auf dem Ziel-NAS reflektiert werden, also auch Löschungen.

Rsync hält für solche Fälle die Option –exclude-from=DATEINAME bereit, bei der eine Beschreibungsdatei der einzuschließenden und auszuschließenden Dateien angegeben werden kann. Für unser Beispiel sieht diese so aus:

- **/@eaDir
- /temp
+ **/
+ **/*.jpg
+ **/*.JPG
+ **/*.jpeg
- *

Die Exclude-From-Datei wird von rsync für jedes Unterverzeichnis und jede Datei vom Anfang bis zum Ende abgearbeitet. Zeilen mit einem Pluszeichen am Anfang fügen Dateien oder Verzeichnisse, auf die das angegebene Muster passt zum Dateiliste hinzu. Zeilen, die mit einem Minuszeichen beginnen, kann man als Abbruchkriterium ansehen. Es funktioniert also nicht, z.B. ein Verzeichnis auszuschließen und anschließend eine Datei in diesem hinzuzufügen. Die letzte Regel schließt alle Dateien aus, die nicht explizit eingeschlossen werden.

Der doppelte Stern signalisiert, dass die Regel für alle Unterverzeichnisse gelten soll. Damit erfasst **/ alle Verzeichnisse, in die rsync abtauchen soll. **/*.jpg selektiert alle *.jpg-Dateien.

Alle angegebenen Pfade sind relativ zum Startverzeichnis, das oben erwähnte /temp Verzeichnis wird also als $PWD/temp verstanden.

Der Aufruf des rsync-Kommandos sollte dann so aussehen:

rsync -r -v -P --delete --exclude-from=DATEINAME  USER@QUELLE VERZEICHNIS

Damit wird rsync die Verzeichnisse rekursiv (-r) durchgehen, die behandelten Dateinamen (-v) und den Kopierfortschritt (-P) ausgeben und auf alle gefundenen Verzeichnisse und Dateien die Regeln aus DATEINAME anwenden und auf der Quelle gelöschte Dateien auf dem Ziel ebenfalls löschen (–delete). Um genauer kontrollieren zu können, was rsync tut, bevor mal es auf seine Daten loslässt, lohnt es sich einen Trockenlauf zu starten.


rsync -r -vv --dry-run -P --delete --exclude-from=DATEINAME  USER@QUELLE VERZEICHNIS

Damit wird keine Datei transferiert oder gelöscht (–dry-run) und zusätzlich zu den Dateinamen die betreffende Regel ausgegeben (-vv).

Die vorgestellte Lösung überträgt die Daten über einen verschlüsselten SSH-Tunnel. Um das Kommando z.B. von Cron ohne Eingabe eines Passwortes laufen zu lassen, sollte zuvor via ssh-keygen und ssh-copy-id der öffentliche Schlüssel des ausführenden Benutzers in die Liste der authorisierten Schlüssel des Zielsystems eingetragen werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Name *

siebzehn + 8 =