ubuntuusers.de

Liste mit Pfaden an Rsync für „--exclude=…“ geben?

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Udalrich

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Folgende Frage ist von Rsync unabhängig, aber ich stolperte über sie bei einem Rsync-Einsatz.

Die Pfade in der Exclude-Angabe einer Rsync-Anweisung würde ich in einem Skript gerne mehrmals verwenden und daher in eine Bash-Variable schreiben. „--exclude-from=Datei“ kenne ich, doch hätte ich die Angaben gerne im Skript.

Direkt angegeben geht es:

rsync --dry-run $optionen ~/Von ~/Nach --exclude={Ordner1/,Ordner/Subordner/}

Doch hätte ich die Pfade aus der „{…}“-Klammer gerne in einer Bash-Variable stehen, also ungefähr so (geht aber nicht) :

variable=Ordner1/,Ordner/Subordner/
rsync --dry-run $optionen ~/Von ~/Nach --exclude={$variable}
…
rsync … --exclude={$variable}

Habe schon mit Anführungszeichen uam. experementiert, doch ohne Erfolg. Weiß jemand die Lösung bitte? Danke.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

Ich würde das so machen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

# configuration
excludes=(/foo /bar /home/gruetze)

...

unset excl

for ex in "${excludes[@]}"; do
  excl+=("--exclude=$ex")
done

rsync --dry-run $optionen ~/Von ~/Nach "${excl[@]}"

Wenn Du sie immer als Exclude-List verwenden willst, dann kannst Du natürlich auch den Schritt weglassen, der die Option davor setzt:

1
2
3
4
5
6
7

# configuration
excl=(--exclude=/foo --exclude=/bar --exclude=/home/gruetze)

...

rsync --dry-run $optionen ~/Von ~/Nach "${excl[@]}"

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Super. Danke, so werde ich es machen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Die redundanten --exclude= kannst Du so einsparen:

1
excl=$(echo "--exclude="{/fooa,/foobar,/bar})

Test:

1
2
echo $excl
--exclude=/fooa --exclude=/foobar --exclude=/bar

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

user_unknown schrieb:

Die redundanten --exclude= kannst Du so einsparen:

1
excl=$(echo "--exclude="{/fooa,/foobar,/bar})

Der echo ist überflüssig und hat auch einen Nachteil. Diese Form ist besser, weil man dann ein ordentliches Array bekommt:

1
excl=("--exclude="{/fooa,/foo\ bar,/bar})

Test:

1
2
3
4
5
6
$ echo "${excl[@]}"
--exclude=/fooa --exclude=/foo bar --exclude=/bar
$ for a in "${excl[@]}"; do echo "$a"; done
--exclude=/fooa
--exclude=/foo bar
--exclude=/bar

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

rklm schrieb:

user_unknown schrieb:

Die redundanten --exclude= kannst Du so einsparen:

1
excl=$(echo "--exclude="{/fooa,/foobar,/bar})

Der echo ist überflüssig und hat auch einen Nachteil. Diese Form ist besser, weil man dann ein ordentliches Array bekommt:

In meiner Sprache "das Echo", aber was ist an einem Array besser?

1
excl=("--exclude="{/fooa,/foo\ bar,/bar})

Test:

1
2
3
4
5
6
$ echo "${excl[@]}"
--exclude=/fooa --exclude=/foo bar --exclude=/bar
$ for a in "${excl[@]}"; do echo "$a"; done
--exclude=/fooa
--exclude=/foo bar
--exclude=/bar

Ah, ich sehe, man hat die Torpfosten verschoben und jetzt Verzeichnisnamen mit Leerstellen im Beispiel. Nun, mein Beispiel hat den Vorteil, dass es mit Leerzeichen ein early-fail bewirkt, so dass man die Leerstellen eliminieren kann und von da an in glücklicher Ehe mit seinen Skripten lebt. ☺

Aber bei einem User, der seinen Ordnern große Anfangsbuchstaben spendiert (Vor, Nach) stößt diese Strategie wohl kaum auf Verständnis. Also gebe ich mich geschlagen.

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

user_unknown schrieb:

Ah, ich sehe, man hat die Torpfosten verschoben und jetzt Verzeichnisnamen mit Leerstellen im Beispiel. Nun, mein Beispiel hat den Vorteil, dass es mit Leerzeichen ein early-fail bewirkt, so dass man die Leerstellen eliminieren kann und von da an in glücklicher Ehe mit seinen Skripten lebt. ☺

Aber bei einem User, der seinen Ordnern große Anfangsbuchstaben spendiert (Vor, Nach) stößt diese Strategie wohl kaum auf Verständnis. Also gebe ich mich geschlagen.

Die echo-Lösung gefällt mir auch sehr gut. Meine Ordner haben tatsächlich keine Leerstellen. Das „Vor, Nach“ war zum besseren Lesen im Forum gedacht. Familien-/LAN-freundliche Ordner für Mausbedienfreunde dürfen bei mir mit Großbuchstaben beginnen, nicht hingegen meine fürs Skripten/Programmieren relevanten Ordner, damit man schneller in der Konsole navigieren kann.

Danke an Euch beide, Rklm und User_unknown, für die kompetente Hilfe.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

user_unknown schrieb:

Ah, ich sehe, man hat die Torpfosten verschoben und jetzt Verzeichnisnamen mit Leerstellen im Beispiel.

Du hast Recht: die gab es natürlich im ursprünglichen Beispiel nicht. Aber die Namen waren so generisch, dass man auch durchaus damit rechnen kann, dass Namen mit ungewöhnlichen Zeichen vorkommen.

Nun, mein Beispiel hat den Vorteil, dass es mit Leerzeichen ein early-fail bewirkt, so dass man die Leerstellen eliminieren kann und von da an in glücklicher Ehe mit seinen Skripten lebt. ☺

Ich verstehe nicht, wieso man sich Einschränkungen bei der Benennung von Verzeichnissen unterziehen soll, die nur daraus resultieren, dass ein Skript nicht so geschrieben ist, dass es mit allen unter Linux erlaubten Dateinamen zurecht kommt. Insbesondere, wenn Datei- oder Verzeichnisnamen beim Schreiben nicht bekannt sind, weil sie als Argumente übergeben werden, erscheint es mir die bessere Variante, gleich solche Fälle zu berücksichtigen - gerade auch, weil das nicht wirklich aufwändig ist. Im Zweifel würde ich lieber Dateinamen zulassen, die demjenigen etwas sagen, der sie vergibt, als mich da einzuschränken.

Udalrich schrieb:

Familien-/LAN-freundliche Ordner für Mausbedienfreunde dürfen bei mir mit Großbuchstaben beginnen, nicht hingegen meine fürs Skripten/Programmieren relevanten Ordner, damit man schneller in der Konsole navigieren kann.

Wo siehst Du die Beschleunigung beim Navigieren in der Konsole? Die bash komplettiert doch auch Dateinamen mit Leerzeichen wunderbar.

Danke an Euch beide, Rklm und User_unknown, für die kompetente Hilfe.

Bitte.

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

rklm schrieb:

Udalrich schrieb:

Familien-/LAN-freundliche Ordner für Mausbedienfreunde dürfen bei mir mit Großbuchstaben beginnen, nicht hingegen meine fürs Skripten/Programmieren relevanten Ordner, damit man schneller in der Konsole navigieren kann.

Wo siehst Du die Beschleunigung beim Navigieren in der Konsole? Die bash komplettiert doch auch Dateinamen mit Leerzeichen wunderbar.

Beschleunigung durch kleingeschriebene Ordner- und Dateinamen, weil ich dann beim Drücken von Tab in der Konsole keine Umschalttaste gedrückt halten muß.
Namen mit Leerstellen komplettiert Bash in der Tat wunderbar.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

Udalrich schrieb:

Beschleunigung durch kleingeschriebene Ordner- und Dateinamen, weil ich dann beim Drücken von Tab in der Konsole keine Umschalttaste gedrückt halten muß.

https://superuser.com/questions/90196/case-insensitive-tab-completion-in-bash

Udalrich

(Themenstarter)

Anmeldungsdatum:
15. Mai 2019

Beiträge: 533

Sehr hilfreich, Rklm, danke. Man lernt nie aus!

Antworten |