MoonKid
Anmeldungsdatum: 9. Februar 2012
Beiträge: 1379
|
Wenn ich tar explizit so ausführe funktioniert das --exclude.
tar -cf archiv.tar folder --exclude={dir1,dir2,dir3} Ohne die geschweiften Klammern akzeptiert tar die Liste nicht. Dreimal ein --exclude zu setzen ist hier keine Option für mich. Das hier geht aber nicht. tar wirft hier keine Fehlermeldung, jedoch ignoriert es das --exclude und bindet die Verzeichnisse dennoch ein.
EXCLUDE="{_trash,work,Emulator}"
tar -cf archiv.tar folder --exclude=$EXCLUDE Warum nicht und wie liese es sich lösen?
|
Yosijo
Anmeldungsdatum: 6. Februar 2012
Beiträge: 33
Wohnort: Berlin
|
Ungetestet:
| EXCLUDE='{_trash,work,Emulator}'
tar -cf archiv.tar folder --exclude="$EXCLUDE"
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Yosijo schrieb: Ungetestet:
... und nicht funktional.
| EXCLUDE='{_trash,work,Emulator}'
tar -cf archiv.tar folder --exclude="$EXCLUDE"
|
Das funktioniert nicht, weil die ursprüngliche Lösung Brace Expansion der bash nutzt. Die kommt hier überhaupt nicht zum tragen. MoonKid schrieb:
Ohne die geschweiften Klammern akzeptiert tar die Liste nicht. Dreimal ein --exclude zu setzen ist hier keine Option für mich.
Warum?
Das hier geht aber nicht. tar wirft hier keine Fehlermeldung, jedoch ignoriert es das --exclude und bindet die Verzeichnisse dennoch ein.
EXCLUDE="{_trash,work,Emulator}"
tar -cf archiv.tar folder --exclude=$EXCLUDE Warum nicht und wie liese es sich lösen?
Probier es aus: $ echo tar -cf archiv.tar folder --exclude={dir1,dir2,dir3}
tar -cf archiv.tar folder --exclude=dir1 --exclude=dir2 --exclude=dir3
$ EXCLUDE="{_trash,work,Emulator}"
$ echo tar -cf archiv.tar folder --exclude=$EXCLUDE
tar -cf archiv.tar folder --exclude={_trash,work,Emulator} Die Brace Expansion findet hier wegen des Quotings nicht statt. Damit sie funktioniert, musst Du aber tatsächlich die ursprüngliche Form verwenden, insbesondere mit dem Namen der Option. Wenn Du das nicht tust, hast Du nur mehrere Muster, aber nicht mehrere "--exclude". Es gibt auch "--exclude-from", vielleicht funktioniert das hier für Dich besser.
|
Yosijo
Anmeldungsdatum: 6. Februar 2012
Beiträge: 33
Wohnort: Berlin
|
Dieses mal getestet:
| EXCLUDE=$(echo --exclude={_trash,work,Emulator})
tar -cf archiv.tar folder $EXCLUDE
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Yosijo schrieb: Dieses mal getestet:
| EXCLUDE=$(echo --exclude={_trash,work,Emulator})
tar -cf archiv.tar folder $EXCLUDE
|
Warum sollte man das tun? Das ist doch komplizierter als die ursprüngliche Lösung. Außerdem beantwortet das die Frage gar nicht.
|
Yosijo
Anmeldungsdatum: 6. Februar 2012
Beiträge: 33
Wohnort: Berlin
|
Teil der Ursprünglichen Frage, war die Lösung, was mMn meine Antwort darstellt. Eine mögliche Lösung.
Der "--exclude-from" Operator ist dafür besser geeignet, aber weiter von der Ursprungsform des ersten Post's entfernt, so das ich diese andere Möglichkeit auch aufführen wollte, da die nähe zum ersten Ansatz, ein besseres Verständnis geben könnte.
|
Yosijo
Anmeldungsdatum: 6. Februar 2012
Beiträge: 33
Wohnort: Berlin
|
Ich muss mich revidieren und entschuldigen. Ganz zu ende gedacht war das auch nicht von mir und der Fehler ist mir jetzt erst aufgefallen, und damit auch erst was du meinst. Für eine Dynamische Handhabung ist mein Konstrukt genau so schlecht geeignet wie das ursprüngliche und von daher "--exclude-from" die beste Lösung darstellt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Yosijo schrieb: Ich muss mich revidieren und entschuldigen. Ganz zu ende gedacht war das auch nicht von mir und der Fehler ist mir jetzt erst aufgefallen, und damit auch erst was du meinst.
😬
Für eine Dynamische Handhabung ist mein Konstrukt genau so schlecht geeignet wie das ursprüngliche und von daher "--exclude-from" die beste Lösung darstellt.
Ich habe aber auch etwas übersehen: die Frage "wie liese es sich lösen?" sagt gar nichts darüber aus, was das "es" eigentlich ist. Du scheinst anzunehmen, dass die Liste dynamisch zusammen gebaut wird. Ich kann das diesem Thema nicht entnehmen. Meine Rückfrage, warum mehrere "--exclude" nicht gehen, ist ja auch noch nicht beantwortet. Ich schlage vor MoonKid klärt das mal auf, dann müssen wir nicht weiter spekulieren. ☺
|
MoonKid
(Themenstarter)
Anmeldungsdatum: 9. Februar 2012
Beiträge: 1379
|
Mehrere "exclude" sind einfach unschön. Will bei einer Liste von Verzeichnissen/Dateien nicht daran denken müssen, jedes Mal ein '--exclude' davorhängen zu müssen. Das ist selbst für ein Kommandozeilen-Tool extrem unergonomisch. Aber ich habs verstanden, was die Klammern machen. Das kannte ich noch nicht. Also das hier funktioniert prima.
#!/bin/bash
EXCLUDE=$(echo --exclude={eins,drei})
mkdir test
mkdir test/eins
mkdir test/zwei
mkdir test/drei
tar --verbose --create \
--file archive.tar \
test \
$EXCLUDE
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Da hätte ich noch 2 Kommentare:
Probier mal, ob das mit Leerzeichen im Dateinamen auch noch funktioniert: 😉 track@lucid:~$ x=$(echo --exclude={eins,"x y",drei})
track@lucid:~$ echo "$x"
--exclude=eins --exclude=x y --exclude=drei
track@lucid:~$ x=(--exclude={eins,"x y",drei}) # Dies ist eine alternative Lösung über ein Bash-Array
track@lucid:~$ echo "$x"
--exclude=eins
track@lucid:~$ set -x
track@lucid:~$ echo "${x[@]}"
+ echo --exclude=eins '--exclude=x y' --exclude=drei
--exclude=eins --exclude=x y --exclude=drei Und bitte: eigene Variablen $klein, denn $GROSS, das sind die Systemvariablen.
LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
track schrieb:
Probier mal, ob das mit Leerzeichen im Dateinamen auch noch funktioniert: 😉
Klar geht das: $ args.sh --exclude={eins,"x y",drei}
3 args
arg[1]: <--exclude=eins>
arg[2]: <--exclude=x y>
arg[3]: <--exclude=drei>
2. Und bitte: eigene Variablen $klein, denn $GROSS, das sind die Systemvariablen.
👍 !
|
nitsnatsnok
Anmeldungsdatum: 27. Oktober 2013
Beiträge: 160
|
Aber ich habs verstanden, was die Klammern machen. Das kannte ich noch nicht.
Und das ist kein Wunder – gibts irgendwo im Wiki eine Beschreibung der Brace Expansions? Ich hab mir das mittlerweile aus anderen Quellen mehr schlecht als recht zusammengeklaubt, aber hier im Wiki noch nichts weiter dazu gefunden (und auch spontan nix wirklich in: Bash, Shell/Einführung, Shell/Tipps und Tricks und Shell/Bash-Skripting-Guide für Anfänger). Hab ich da gewaltig was übersehen oder gibts dazu wirklich noch nichts und es wäre ein Kandidat für Wiki/Artikelideen? Das könnte man auch gleich mit Regex und Wildcards verbinden, über die gleichsam bisher nur einige Einzelartikel (z. B. grep (Abschnitt „Regular-Expressions“), Bash (Abschnitt „Wildcards“) vermischt mit Miniexkurs Brace Extensions) informieren. Dann müsste find (Abschnitt „Name“) auch nicht mehr auf die Wikipedia verweisen, um sowas wie Wildcards erklären zu können.
|