Mit rsync synchronisierst du Dateien zwischen zwei Orten - lokal oder über das Netzwerk. Dabei willst du oft bestimmte Dateien oder Verzeichnisse ausschließen: temporäre Dateien, Build-Artefakte oder Caches haben in einem Backup nichts verloren.

Dieser Artikel zeigt dir die verschiedenen Methoden, um Dateien und Verzeichnisse beim Synchronisieren auszuschließen.

Grundlagen

Die folgenden Beispiele verwenden rsync mit der Option -a (Archivmodus). Dieser Modus kopiert rekursiv und erhält dabei Berechtigungen, Zeitstempel, symbolische Links und Eigentümer.

Beim Ausschließen gibst du immer relative Pfade zum Quellverzeichnis an - nicht absolute Pfade.

Zwei Optionen stehen zur Verfügung:

  • --exclude - Ausschlüsse direkt auf der Kommandozeile angeben
  • --exclude-from - Ausschlüsse aus einer Datei lesen

Eine einzelne Datei ausschließen

Mit --exclude schließt du eine bestimmte Datei aus:

rsync -a --exclude 'config.local' src/ dst/

Die Datei src/config.local wird nicht kopiert. Alle anderen Dateien werden normal synchronisiert.

Ein Verzeichnis ausschließen

Verzeichnisse schließt du genauso aus wie Dateien:

rsync -a --exclude 'node_modules' src/ dst/

Das komplette Verzeichnis src/node_modules/ wird übersprungen.

Möchtest du nur den Inhalt eines Verzeichnisses ausschließen, aber das leere Verzeichnis selbst behalten, verwende einen Wildcard:

rsync -a --exclude 'cache/*' src/ dst/

Das Verzeichnis cache/ wird erstellt, bleibt aber leer.

Mehrere Ausschlüsse angeben

Mehrere –exclude Optionen

Für mehrere Ausschlüsse wiederholst du die Option:

rsync -a --exclude 'node_modules' --exclude '.git' --exclude '*.log' src/ dst/

Kurzform mit geschweiften Klammern

Bash erlaubt eine kompaktere Schreibweise mit Brace Expansion:

rsync -a --exclude={'node_modules','.git','*.log'} src/ dst/

Beide Varianten sind gleichwertig.

Ausschlüsse aus einer Datei lesen

Bei vielen Ausschlüssen wird die Kommandozeile unübersichtlich. Lagere sie in eine Datei aus:

rsync -a --exclude-from='exclude-list.txt' src/ dst/

Die Datei exclude-list.txt enthält einen Eintrag pro Zeile:

node_modules
.git
*.log
.DS_Store
__pycache__

Das ist besonders praktisch für wiederkehrende Backup-Aufgaben.

Ausschlüsse mit Mustern

Mit Wildcards schließt du mehrere Dateien auf einmal aus.

Dateien nach Endung ausschließen

Alle .tmp-Dateien ausschließen:

rsync -a --exclude '*.tmp' src/ dst/

Nur bestimmte Dateien kopieren

Der umgekehrte Fall ist komplexer: Nur .jpg-Dateien kopieren und alles andere ausschließen.

Dafür kombinierst du --include und --exclude:

rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src/ dst/

Die Reihenfolge ist entscheidend - die erste passende Regel gewinnt:

  1. --include='*.jpg' - Alle JPG-Dateien einschließen
  2. --include='*/' - Alle Verzeichnisse einschließen (damit rsync in Unterverzeichnisse schauen kann)
  3. --exclude='*' - Alles andere ausschließen
  4. -m - Leere Verzeichnisse entfernen

Alternative mit find

Du kannst auch find nutzen, um die Dateiliste zu erstellen:

find src/ -name "*.jpg" -printf '%P\0' | rsync -a --files-from=- --from0 src/ dst/

Die Option -printf '%P\0' entfernt das Quellverzeichnis aus dem Pfad und trennt Einträge mit Nullbytes. Mit --from0 liest rsync diese nullterminierten Pfade.

Zusammenfassung

Mit --exclude und --exclude-from kontrollierst du präzise, welche Dateien rsync überträgt. Für einfache Fälle reicht --exclude auf der Kommandozeile. Bei komplexeren Setups lohnt sich eine Exclude-Datei, die du versionieren und wiederverwenden kannst.