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:
--include='*.jpg'- Alle JPG-Dateien einschließen--include='*/'- Alle Verzeichnisse einschließen (damit rsync in Unterverzeichnisse schauen kann)--exclude='*'- Alles andere ausschließen-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.