[gelöst] rsync und --exclude=...

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

[gelöst] rsync und --exclude=...

Beitrag von smutbert » 16.10.2017 19:03:54

Hallo,

ich schaffe es nicht ein paar Excludes so zu schreiben, dass sie funktionieren.

Ich versuche ein btrfs subvolume mit rsync zu kopieren. Das Subvolume enthält Homedirectories und einiges würde ich gerne ausschließen, zum Beispiel

Code: Alles auswählen

/mnt/BTRFS/debian.home/smutbert/.local/share/Trash
Mein rsync-Befehl sieht so aus

Code: Alles auswählen

EXCLUDE='--exclude=.local/share/Trash'
rsync -a --delete $EXCLUDE /mnt/BTRFS/debian.home/ /media/smutbert/backup/debian.home
aber ich hätte gerne den Pfad relativ zur Quelle oder dem Ziel angegeben, also etwa in dieser Art

Code: Alles auswählen

EXCLUDE="--exclude='/*/.local/share/Trash'"
was aber nicht funktioniert.

Das blöde ist, dass ich nicht einmal mein Problem genau erkenne. Zuerst dachte ich es wäre nur das Quoting, aber da habe ich inzwischen alle Varianten, die mir einfallen mehrfach durchgespielt.
Trotzdem habe ich mit dem Befehl ohne Variable Erfolg:

Code: Alles auswählen

sync -a --delete --exclude='/*/.local/share/Trash' /mnt/BTRFS/debian.home/ /media/smutbert/backup/debian.home
Helft mir bitte auf die Sprünge

lg smutbert
Zuletzt geändert von smutbert am 18.10.2017 15:43:41, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: rsync und --exclude=...

Beitrag von heisenberg » 16.10.2017 19:25:35

Wenn das Dein Quellpfad ist

Code: Alles auswählen

 /mnt/BTRFS/debian.home/
dann muss Dein Exclude auch damit beginnen. Entweder als String wie geschrieben oder als Wildcard. Der * ist bei rsync ein Wildcard ohne den /. Als Wildcard mit / den ** (Doppelstern) verwenden.
Siehe rsync-manpage.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: rsync und --exclude=...

Beitrag von tobo » 16.10.2017 19:47:17

Ein führender / im Exclude ist gleichzusetzen mit dem Pfad zur Quelle. Sieht falsch aus, sollte aber funktionieren:

Code: Alles auswählen

EXCLUDE='--exclude=/.local/share/Trash'

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: rsync und --exclude=...

Beitrag von smutbert » 16.10.2017 21:12:10

Die rsync-Manpage habe ich öfter als einmal gelesen. Vielleicht einmal der Reihe nach den kompletten Pfad, meine Quelle und mein bisheriges exclude und das von tobo:

Code: Alles auswählen

/mnt/BTRFS/debian.home/smutbert/.local/share/Trash

/mnt/BTRFS/debian.home/
                      /*/.local/share/Trash
                               /.local/share/Trash
Meiner Meinung nach kann tobos exclude nicht passen, weil es nicht den Benutzernamen im Pfad berücksichtigt.

@heisenberg
Hm, wenn ich deinen Beitrag nicht mißverstehe, widersprichst du im Grunde der rsync-Dokumentation und dem was tobo sagt.


Mißverstehe ich hier tatsächlich etwas so grundlegend?
Und wenn ja wieso funktioniert dann mein Befehl mit --exclude='...' und scheitert erst dann, wenn ich das Exclude in einer Variable speichere?
Zuletzt geändert von smutbert am 17.10.2017 09:40:57, insgesamt 2-mal geändert.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: rsync und --exclude=...

Beitrag von tobo » 16.10.2017 22:07:18

smutbert hat geschrieben: ↑ zum Beitrag ↑
16.10.2017 21:12:10
Meiner Meinung nach kann tobos exclude nicht passen, weil es nicht den Benutzernamen im Pfad nicht berücksichtigt.
Richtig, denn den habe ich oben auch übersehen und mich an die rsync-Zeile gehalten!?
Und wenn ja wieso funktioniert dann mein Befehl mit --exclude='...'
Der ist relativ und funktioniert auch. Allerdings greift der überall, nicht nur direkt in den Home-Verzeichnissen. Ok, bei der speziellen Pfadangabe ist wohl auszuschließen, dass es den nochmal tiefer in der Verzeichnis-Hierarchie gibt!?
und scheitert erst dann, wenn ich das Exclude in einer Variable speichere?
Im einfachsten Fall schreibst du in deine Excludes jetzt noch jeweils die Home-Verzeichnis vorne dran. Pro --Exclude nur "ein" exclude-Verzeichnis. Und vielleicht ist das auch das Problem der Expandierung mittels *!?

EDIT:Schon wieder nicht richtig gelesen. Es scheitert ja nur die Variable. Zu spät für heute...

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: rsync und --exclude=...

Beitrag von heisenberg » 17.10.2017 08:32:16

Ich habe das so geschrieben, wie ich die Manpage verstanden habe.

Allerdings scheine ich einen kleinen Teil falsch verstanden zu haben. Dein Exclude-Muster ist so erst mal grundsätzlich vollkommen richtig.

Zunächst mal das was wohl auf jeden Fall so korrekt ist(Weil der Wildcard ** auch auf einen Leerstring passt):

Annahme Exclude: /home/maddin/data/finanzamt/cache

Code: Alles auswählen

quelle="/home/maddin/data"
ziel="/home/backup"

# Das geht mit Wildcard am Anfang des Excludes
rsync -av --exclude="**/data/finanzamt/cache" "$quelle" "$ziel"

# natürlich auch als Variable(Das Quoting ist eine mögliche Fehlerquelle. Das Exclude-Argument darf nicht nochmal gequotet werden!)
exclude='--exclude=**/data/finanzamt/cache'
rsync -av $exclude "$quelle" "$ziel"
Was ich noch nicht klar hatte, war, dass der exclude wohl immer relativ zum Quellpfad ist. Also geht auch das hier ohne Wildcards:

Code: Alles auswählen

# Das geht ohne Wildcards
rsync -av --exclude="data/finanzamt/cache" "$quelle" "$ziel"

# natürlich auch als Variable(Das Quoting ist eine mögliche Fehlerquelle. Das Exclude-Argument darf nicht nochmal gequotet werden!)
exclude='--exclude=data/finanzamt/cache'
rsync -av $exclude "$quelle" "$ziel"
Das Problem ist vermutlich die Art der Variablenzuweisung:

Code: Alles auswählen

EXCLUDE="--exclude='/*/.local/share/Trash'"
Das hatte ich bei meinem Test auch erst so getippt. Es hat so nicht funktioniert. Es liegt vermutlich an der Abarbeitungsreihenfolge der Shell, welche die Variablenwertersetzung vermutlich nach der Quote-Zeichenverarbeitung durchführt. D. h. das Argument, dass bei rsync für exclude ankommt ist nicht /*/.local/share/Trash sondern '/*/.local/share/Trash'. Deswegen also die einfachen Hochkommata weglassen.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: rsync und --exclude=...

Beitrag von smutbert » 17.10.2017 10:26:27

Danke, das hätte lange gedauert, bis ich darauf gekommen wäre, aber sollte ich bei dieser Variante

Code: Alles auswählen

EXCLUDE='--exclude=/*/.local/share/Trash'
#oder
EXCLUDE="--exclude=/*/.local/share/Trash"
rsync -av $EXCLUDE "$quelle" "$ziel"
nicht noch sicherheitshalber das Globbing im rsync-Aufruf verhindern?

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: rsync und --exclude=...

Beitrag von heisenberg » 17.10.2017 11:09:04

Quoting der Variable reicht wahrscheinlich aus:

Also statt ...

Code: Alles auswählen

rsync -av $EXCLUDE "$quelle" "$ziel"
dieses hier...

Code: Alles auswählen

rsync -av "$EXCLUDE" "$quelle" "$ziel"
...das hätte lange gedauert, bis ich darauf gekommen wäre,...
Mir hat set -x geholfen um den Fehler zu finden.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: rsync und --exclude=...

Beitrag von smutbert » 17.10.2017 11:51:52

Weil es auch mit mehreren --exclude=... in einer Variablen laufen soll, habe ich es mit \* versucht, was aber wieder nicht funktioniert.

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: rsync und --exclude=...

Beitrag von heisenberg » 17.10.2017 12:42:53

Geht das(Array)?

Code: Alles auswählen

exclude=('--exclude=exclude1' '--exclude=exclude2')
rsync "${exclude[@]}" "$quelle" "$ziel"
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: rsync und --exclude=...

Beitrag von smutbert » 17.10.2017 13:37:01

Keine Ahnung, in Wirklichkeit ist mein EXCLUDE nämlich schon ein array, das die excludes für unterschiedliche rsync-Aufrufe enthält :mrgreen:
(Früher hatte ich die excludes in Textdateien stehen und --exclude-from verwendet, aber die vielen Dateien hab ich als unpraktisch empfunden...)

ich hab jetzt, inspiriert von deinem Tipp mit set -x

Code: Alles auswählen

set -f
rsync ...
set +f
gemacht, bin aber offen für Alternativen.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: [gelöst] rsync und --exclude=...

Beitrag von tobo » 18.10.2017 20:46:12

Da ich inzwischen, wie ich glaube, das Problem auch vollumfänglich verstanden habe:
Der führende / im exclude ist wichtig und wird dort ersetzt durch die Quelle. Jede andere Form (*/, **/, .local/) ist relativ und damit eben ohne Bezug zur Quelle.

Zum Quoting der Variable hat heisenberg ja schon was geschrieben. Hier noch etwas ausführlicher:
http://linuxplayer.org/2011/10/bash-quo ... n-not-work

Der angezeigte Weg wäre somit sowas:

Code: Alles auswählen

EXCLUDE='--exclude="/*/.local/share/Trash"'
eval rsync -av $EXCLUDE "$quelle" "$ziel"

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst] rsync und --exclude=...

Beitrag von smutbert » 18.10.2017 22:58:27

Die Lösung gefällt mir noch besser. Danke für die Bemühungen und den Link!

Antworten