Marcel Krüger

How to Rsync-Exclude

Featuring /dir/ /dir dir/ und dir*

22. Feb. 2020

Hier einige Beispiele, wie man mit rsync das exkludiert, was man exkludieren möchte und nicht mehr und nicht weniger. Zur Demonstration folgen einige rsync-Aufrufe, die teile eines exemplarischen Quellverzeichnisses src in ein Zielverzeichnis dst kopieren.

Das Quellverzeichnis sieht folgerndermaßen aus:

src:
├── dir1
│   └── dir11
│       ├── file1
│       └── file2
├── dir2
│   ├── dir1
│   └── dir21
├── file1
└── file2

Die Verzeichnisansichten in diesem Post wurden mit dem Kommandozeilentool tree erzeugt

Ordner ausschließen

Der Befehl rsync -a --exclude '/dir1' src/ dst erzeugt folgendes im Zielverzeichnis:

dst:
├── dir2
│   ├── dir1
│   └── dir21
├── file1
└── file2

dir1 im Arbeitsverzeichnis wurde ausgelassen. /dir2/dir1 ist noch da. Ergo: Das / am Anfang von /dir1 führt dazu, dass vom aktuellen Verzeichnis ausgegangen wird.

rsync geht immer vom aktuellen Arbeitsverzeichnis aus. --exclude '/dir1' führt also nicht dazu, dass Ordner oder Dateien mit dem Namen dir1 aus Unterverzeichnissen ignoriert werden.

Weiterhin bedeutet es nicht, dass im Wurzelverzeichnis / des Systems gesucht wird.

Das anfügen eines / am Quellverzeichnis src führt dazu, dass nur der Inhalt des Quellverzeichnisses kopiert wird, nicht das Verzeichnis selbst.

Es macht also ein Unterschied, ob man rsync -a src dst oder rsync -a src/ dst aufruft.

Hier das Zielverzeichnis, wenn / weg gelassen wird:

dst:
├── dir2
│   └── dir21
├── file1
└── file2

Hier fehlt dir1 sowohl im Arbeits- als auch im Unterverzeichnis.

Ordner inkludieren, inhalte ausschließen

Mittels --exclude '/dir1/*' können Ordner synchronisiert werden, deren Inhalte aber ausgeschlossen werden:

dst:
├── dir1
├── dir2
│   ├── dir1
│   └── dir21
├── file1
└── file2

Dateien/Ordner ausschließen

Dateien werden natürlich genauso wie Ordner von den mit --exclude angegebenen Mustern ausgeschlossen. Beispiel: --exclude 'file*' schließt Dateien und Ordner aus, die mit file beginnen:

dst:
├── dir1
│   └── dir11
└── dir2
    ├── dir1
    └── dir21

--exclude 'file*/' würde lediglich Ordner ausschließen, die mit der Zeichenkette file beginnen.

Mehrere Muster ausschließen

Selbstverständlich kann --exclude auch mehrfach andeinandergereiht werden: `rsync -a --exclude '/dir1' --exclude '/dir2' src/ dst

Vieles ausschließen

Hat man sehr viel auszuschließen, kann der Parameter --exclude-from 'exclude-list.txt' genutzt werden.. In diesem Beispiel können in der Datei exclude-list.txt alle gewünschten Exclude-Muster in jeweils einer eigenen Zeile angegeben werden. Kommentare können mit # eingeleitet werden.

Beispiel für eine exclude-list.txt:

/dir1
/dir2/*
file1

Eine gute Exclude-Liste für Home-Verzeichnisse ist hier zu finden.