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
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: |
# 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
Anmeldungsdatum: 10. August 2005
Beiträge: 17620
Wohnort: Berlin
|
Die redundanten --exclude= kannst Du so einsparen: | excl=$(echo "--exclude="{/fooa,/foobar,/bar})
|
Test:
| echo $excl
--exclude=/fooa --exclude=/foobar --exclude=/bar
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13204
|
user_unknown schrieb: Die redundanten --exclude= kannst Du so einsparen: | 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: | excl=("--exclude="{/fooa,/foo\ bar,/bar})
|
Test: | $ 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
Anmeldungsdatum: 10. August 2005
Beiträge: 17620
Wohnort: Berlin
|
rklm schrieb: user_unknown schrieb: Die redundanten --exclude= kannst Du so einsparen: | 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?
| excl=("--exclude="{/fooa,/foo\ bar,/bar})
|
Test: | $ 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
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
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!
|