rsync Verzeichnis ausschließen funktioniert nicht

34

Ich verwende Fedora 17 64-Bit und das rsync --exclude=/home/ben/<dir>funktioniert nicht wie erwartet.

Ich versuche rsyncmein Home-Verzeichnis auf ein USB-Stick zu verschieben, aber ich möchte auf jeden Fall Verzeichnisse ausschließen, die Cache-Dateien enthalten und Dateien erstellen. Dies ist der Befehl, den ich benutze:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Inhalt von ~/buildund ~/.ccachewird jedoch von kopiert rsync. Was mache ich falsch?

Freedom_Ben
quelle
1
Ich denke, Muster ausschließen funktioniert einfach nicht.
Sören

Antworten:

37

Globale rsyncFilterregeln, die mit einem führenden beginnen, /sind an der Wurzel der Übertragung verankert . Zitat aus dem Abschnitt "INCLUDE / EXCLUDE PATTERN RULES" der Manpage:

Beginnt das Muster mit einem /, wird es an einer bestimmten Stelle in der Hierarchie der Dateien verankert, andernfalls wird es mit dem Ende des Pfadnamens abgeglichen. Dies ähnelt einem führenden ^ in regulären Ausdrücken. Somit würde "/ foo" entweder am "Stamm der Übertragung" (für eine globale Regel) oder im Verzeichnis der Zusammenführungsdatei (für eine Regel pro Verzeichnis) mit dem Namen "foo" übereinstimmen.

In Ihrem Befehl ( rsync ... -arv /home/ben home-ben/) /home/ben/foowürde die Datei nach übertragen home-ben/ben/foo. Die Wurzel der Übertragung ist home-benund der richtige Filterpfad ist /ben/foo. Somit,

  • Zum Abgleichen /home/ben/.ccachebenötigen Sie einen Filterpfad von/ben/.ccache
  • Zum Abgleichen /home/ben/build/benötigen Sie einen Filterpfad von/ben/build/

Eine ausführlichere Erklärung finden Sie im Abschnitt "ANCHORING INCLUDE / EXCLUDE PATTERNS" der rsync(1)Manpage .


Beachten Sie, dass das Weglassen des Führenden /nicht unbedingt das ist, was Sie wollen. Nochmals zitieren aus demselben Manpage-Abschnitt:

Ein nicht qualifiziertes "foo" würde überall im Baum mit dem Namen "foo" übereinstimmen, da der Algorithmus rekursiv von oben nach unten angewendet wird. Es verhält sich so, als würde jede Pfadkomponente am Ende des Dateinamens gedreht. Sogar das nicht verankerte "sub / foo" würde an jedem Punkt in der Hierarchie übereinstimmen, an dem ein "foo" in einem Verzeichnis mit dem Namen "sub" gefunden wurde. Im Abschnitt ANCHORING INCLUDE / EXCLUDE PATTERNS erfahren Sie, wie Sie ein Muster angeben, das im Stammverzeichnis der Übertragung übereinstimmt.

Somit würde ein Filtermuster von build/mit einem Erstellungsverzeichnis überall in /home/bensogar übereinstimmen /home/ben/many/sub/directories/build/.

jw013
quelle
2
Das entscheidende Detail ist, dass Schrägstriche wichtig sind. Wenn Sie einen Schrägstrich an das Ende des Quellverzeichnisses anhängen (rsync -a source / destination), wird der Inhalt der Quelle rsync -a source destinationkopiert , andernfalls wird das Quellverzeichnis selbst in das Ziel kopiert. Hiermit wird festgelegt, wie der Stamm der Übertragung lautet, um den Ausschlussausdruck zu informieren. Die ordnungsgemäße Verwendung von / im Ausschlussausdruck wird dann oben erläutert. Beachten Sie insbesondere, dass dies rsync --exclude='/dir1' source destinationnichts ausschließt.
Pgoetz
11

Ich denke, Ihre excludePfade müssen relativ zum Quellpfad sein. Können Sie das stattdessen versuchen?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

Hier ist ein Test zum Vergleich:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
HorsePunchKid
quelle
2
Diese Antwort ist falsch. Mit einem relativen Ausschlusspfad würden Sie das Muster überall ausschließen!
Rubo77
Dieser Beitrag ist korrekt. Der Abgleich basiert auf Text und nicht auf Inode-Dateien. Welchen Weg auch immer die Ausgabe des --verboseBefehls zeigt das Format , das Sie verwenden.
Sridhar Sarnobat
Das hat bei mir funktioniert.
Zhenyu
Was ist, wenn der Quellpfad '/' ist, dann sind die relativen Pfade absolut, aber es funktioniert immer noch nicht.
Sören
Dies ist das einzige, was bei mir funktioniert hat.
Jonathan
2

Ich hatte dieses Problem in einem Skript (ich weiß nicht, ob es Ihr Fall ist). Ich habe diesen Befehl in einem Skript verwendet und sh anstelle von bash verwendet. Überprüfe den Schebang am Anfang deines Skripts.

Jaoued Zahraoui
quelle
1

Ihr Ausschlussmuster würde funktionieren, wenn Sie den gesamten Pfad / den Ausgangspfad synchronisieren, dh ohne einen abschließenden Schrägstrich:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Aber besser nur den Inhalt des Ordners mit einem abschließenden Schrägstrich synchronisieren:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

Sie können auch eine Ignorierliste verwenden, siehe: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folder

rubo77
quelle
0

Um einen bestimmten Ordner mit rsync auszuschließen, müssen Sie den relativen Pfad im Befehl berücksichtigen. in deinem Fall:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

Dabei ist "ben" der Ordner, den Sie synchronisieren

Samoht Rusconi
quelle