rsync exclude Verzeichnis funktioniert nicht

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

Ich versuche, rsync mein Ausgangsverzeichnis auf ein USB-Stick zu übertragen, möchte jedoch Verzeichnisse ausschließen, die Cache-Dateien enthalten und Dateien erstellen. Dies ist der Befehl, den ich verwende:

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

Inhalt aus ~/build und ~/.ccache wird von rsync kopiert. Was mache ich falsch?

Kommentare

  • Ich denke, Ausschlussmuster funktionieren einfach nicht '.

Antwort

Globale rsync Filterregeln, die mit einem führenden / beginnen, sind an der Wurzel von verankert Zitat aus dem Abschnitt „INCLUDE / EXCLUDE PATTERN RULES“ der Manpage:

Wenn das Muster mit einem / beginnt, wird es in a verankert bestimmte Stelle in der Hierarchie der Dateien, andernfalls wird sie mit dem Ende des Pfadnamens abgeglichen. Dies ähnelt einem führenden ^ in regulären Ausdrücken. Somit würde „/ foo“ mit dem Namen „foo“ entweder an der „Wurzel des“ übereinstimmen transfer „(für eine globale Regel) oder in das Verzeichnis der Zusammenführungsdatei“ (für eine pro-Verzeichnis-Regel).

In Ihrem Befehl (rsync ... -arv /home/ben home-ben/) ist die Datei /home/ben/foo würde an home-ben/ben/foo übertragen. Die Wurzel der Übertragung ist home-ben und der richtige Filterpfad ist /ben/foo. Um

  • mit /home/ben/.ccache übereinzustimmen, benötigen Sie einen Filterpfad von /ben/.ccache
  • Um mit /home/ben/build/ übereinzustimmen, benötigen Sie einen Filterpfad von /ben/build/

Eine detailliertere Erklärung kann sein finden Sie im Abschnitt „ANCHORING INCLUDE / EXCLUDE PATTERNS“ der rsync(1) Manpage .


Beachten Sie, dass Sie nicht unbedingt das führende / weglassen müssen. Nochmals aus demselben Manpage-Abschnitt zitieren:

Ein nicht qualifiziertes „foo“ würde an einer beliebigen Stelle im Baum mit dem Namen „foo“ übereinstimmen, da der Algorithmus angewendet wird rekursiv von oben nach unten; Es verhält sich so, als ob jede Pfadkomponente am Ende des Dateinamens an der Reihe ist. 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 ANKEREN VON EINSCHLIESSEN / AUSSCHLIESSEN VON MUSTERN finden Sie eine ausführliche Beschreibung zum Angeben eines Musters, das im Stammverzeichnis der Übertragung übereinstimmt.

Somit würde ein Filtermuster von build/ mit einem Build-Verzeichnis irgendwo in , sogar /home/ben/many/sub/directories/build/.

Kommentare

  • Das wichtigste Detail ist, dass Schrägstriche wichtig sind . Wenn Sie einen Schrägstrich an das Ende des Quellverzeichnisses anhängen (rsync -a Quelle / Ziel), wird der Inhalt der Quelle kopiert, andernfalls rsync -a source destination kopiert das Quellverzeichnis selbst in das Ziel. Dies bestimmt, wie die Wurzel der Übertragung aussehen wird, um den Ausschlussausdruck zu informieren. Die ordnungsgemäße Verwendung von / im Ausschlussausdruck wird dann oben erläutert. Beachten Sie insbesondere, dass rsync --exclude='/dir1' source destination ' nichts ausschließt.

Antwort

WARNUNG: Per @ rubo77 „Kommentar unten Diese Antwort sollte nur verwendet werden, wenn Sie bereit sind, diese Elemente überall in Ihrem Quellbaum auszuschließen, nicht nur an der Wurzel. Eine ausführlichere Erklärung finden Sie in der Antwort von @ jw013 oben.

Ich denke, Ihre exclude -Pfade müssen relativ zum Quellpfad sein Versuchen Sie dies stattdessen?

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 

Kommentare

  • Diese Antwort ist falsch. Mit einem relativen Ausschlusspfad würden Sie das Muster überall ausschließen!
  • Dieser Beitrag ist korrekt. Der Abgleich basiert auf Text und nicht auf Datei-Inode. Welchen Pfad die Ausgabe des Befehls --verbose anzeigt, ist das Format, das Sie verwenden müssen.
  • Dies hat bei mir funktioniert.
  • Was ist, wenn das Quellpfad ist ' / ' dann sind absolut die relativen Pfade, aber es ist immer noch nicht ' funktioniert nicht.
  • Dies ist das einzige, was für mich funktioniert hat.

Antwort

Ihr Ausschlussmuster würde funktionieren, wenn Sie den gesamten / Home-Pfad synchronisieren, d. hohne abschließenden Schrägstrich:

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

Synchronisieren Sie jedoch besser nur den Inhalt des Ordners mit einem abschließenden Schrägstrich:

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-folders

Antwort

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

Kommentare

  • Wie würde die Shell-Auswahl des Shell-Interpreters dieses spezielle Problem verursachen?

Antwort

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

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

wobei „ben“ der Ordner ist, den Sie synchronisieren

Schreibe einen Kommentar

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