Wie kann man mit rsync mehrere Verzeichnisse ausschließen?

184

Ich versuche, mein Ausgangsverzeichnis mit rsync zu sichern, und möchte einige der Verzeichnisse ausschließen, die Junk enthalten. Ich möchte ausdrücklich ausschließen /home/ben/.ccacheund /home/ben/build. Leider war die Dokumentation für rsync überladen und beantwortete meine Frage nicht. Das habe ich versucht:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Was ist der richtige Weg, um dies zu tun?

Freedom_Ben
quelle
4
Ich wollte nur sagen, dass die Flagge bereits aimpliziert r:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Antworten:

238

OK, ich fühle mich wirklich dumm. Bevor ich diese Frage überhaupt gestellt habe, hat mir mein Freund gezeigt, wie es geht und es ist wirklich einfach. Um mehrere Verzeichnisse auszuschließen, verwenden Sie einfach mehrere --exclude=pathSchalter. So ist mein Befehl oben richtig geschrieben wie folgt:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
quelle
7
Ein absoluter Pfad war nicht für mich arbeiten (das Verzeichnis wurde stillschweigend nicht ausgeschlossen angegeben), während ein Pfad relativ zum Quellverzeichnis korrekt gearbeitet. Vielleicht fehlt mir etwas, aber ich wäre vorsichtig mit der Behauptung von @FreeSoftwareServers, dass absolute Pfade immer funktionieren.
Soren Bjornstad
5
Zu Ihrer Information: Die Option -ainclude -rso -arist redundant.
David
4
Im Gegensatz zu FreeSoftwareServers ist der Ausschlusspfad relativ zum Quellpfad, NICHT /. Daher ist dieser Kommentar kategorisch falsch und führt zu Fehlern, wenn Sie ihn befolgen. Die beste Strategie ist, die führenden / in Ihren Ausschlüssen wegzulassen, um diese Art von mentalem Fehler zu vermeiden. Wenn source / home / me ist und Sie = '/ mydir /' ausschließen, wird das Verzeichnis mydir in / home / me ausgeschlossen, dh / home / me / mydir NOT / mydir / at /. Es ist bedauerlich, dass ich diesen Kommentar weder ablehnen noch bearbeiten kann, da er technisch falsch ist und in die Irre führen wird.
Lizardx
3
Zu Ihrer Information für spätere Reisende, es sieht so aus, als ob der betreffende Kommentar von @FreeSoftwareServer entfernt wurde. tl; dr: verwende relative Pfade
Freedom_Ben
2
Wenn du dumm bist, bin ich es auch und 179 andere Upvoter!
Sridhar Sarnobat
108

Wenn Sie mehrere Verzeichnisse und / oder Dateien ausschließen möchten, erstellen Sie eine Textdatei und verwenden Sie den --exclude-fromSchalter. Erstellen Sie eine Datei mit dem Namen exclude_me.txtund listen Sie darin Ihre Ausschlüsse auf. Beispiel ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Dann würde Ihr rsync ungefähr so ​​aussehen:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Dies sind einige Informationen zu Filterregeln, die hilfreich sein können:

  • /dir/ bedeutet, den Stammordner auszuschließen /dir
  • /dir/*bedeutet, den Stammordner, /diraber nicht den Inhalt zu erhalten
  • dir/ bedeutet, dass Ordner ausgeschlossen werden, in denen der Name enthalten ist dir/

  • Ausgeschlossene Beispiele: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfbedeutet, dass Dateien übersprungen werden, die cfin einem beliebigen Ordner beginnen/var/spool/lpd

Siehe auch den Abschnitt Filterregeln auf der Manpage.

user228759
quelle
4
Es ist wichtig zu beachten, dass der Stammordner das Stammverzeichnis der Übertragung und nicht das Stammverzeichnis ist.
Jamesdlin
Das ist eine brillante Antwort!
Alexander Zhukov
85

Sie können auch mehrere Pfade in geschweiften Klammern ausschließen:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
quelle
40
das funktioniert gut, nur nicht unter sh, nur unter bash, ich fand heraus "the hard way"
xor
7
Kein Leerzeichen nach dem Komma. Das habe ich auch auf die harte Tour
gelernt
Und benutze nicht '' like --exclude = '. Gvfs'
Martin T.
FWIW, ich denke geschweifte Klammern funktionieren mit ksh. Für andere Shells, könnten Sie wahrscheinlich so etwas wie verwenden: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Oder Sie könnten einfach mehrere --excludeArgumente verwenden, die Sie manuell eingeben müssten.
TSJNachos117
1
Der Grund, warum dies funktioniert, ist die "Klammererweiterung", falls sich jemand die Details ansehen möchte.
Shredalert