FreeFun
Anmeldungsdatum: 11. August 2016
Beiträge: Zähle...
|
Ich versuche gerade verschiedene Unterverzeichnis in eine zip zu bekommen aber so recht mag das zip Programm dies nicht. Hab es so versucht:
zip -r zipname.zip ./folder1/und/so/weiter/* ./folder2/und/so/weiter/* ./folder3/und/so/weiter/*
So das in der zip nur das in der Ersten ebene Liegt was nach weiter/ kommt! Bekomme ich das auch irgendwie anders hin?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Was willst Du genau einpacken ?
Du solltest die zip - Option -r weglassen, denn die sammelt immer den kompletten Verzeichnisbaum ein. Du kannst Dir die Dateiliste mal mit echo oder printf angucken: printf '%s\n' ./folder1/und/so/weiter/* ./folder2/und/so/weiter/* ./folder3/und/so/weiter/* ggf. könntest Du die Verzeichnisliste noch zusammenfassen: printf '%s\n' ./folder*/und/so/weiter/*
LG, track
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
Ich möchte einfach weiter Ordner Packen also erst ab einem gewissen punkt dann alle weitere Ordner. Hab es jetzt so gelöst:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
name=main
zipdir=$(cd ../test2 && pwd)
workdir=$(pwd)
cd folder1/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder2/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder3/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder4/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder5/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder6/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
|
Find es zwar nicht optimal aber es tut was es soll da er ja beim Zippen die vorhandene Updatet. Es wird ja dabei nichts überschrieben.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Wenn Du Java installiert hast, sollte es da den Java-Archiver geben, der im Wesentlichen Zipfiles erzeugt. Da kannst Du angeben es soll vom Verzeichnis Verz archiviert werden: | jar -C folder1/und/so/weiter WEITERE_OPTIONEN
|
Das für Java automatische anlegen eines i.d.R. unschädlichen Manifests kann man mit -M unterdrücken, also | jar -MC folder1/und/so/weiter WEITERE_OPTIONEN
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
FreeFun schrieb: Ich möchte einfach weiter Ordner Packen also erst ab einem gewissen punkt dann alle weitere Ordner.
Was ist denn der Grund bzw. Anwendungsfall?
Hab es jetzt so gelöst:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
name=main
zipdir=$(cd ../test2 && pwd)
workdir=$(pwd)
cd folder1/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder2/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder3/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder4/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder5/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
cd folder6/und/so/weiter && zip -r "$zipdir/$name".zip .
cd "$workdir"
|
Das ist unnötig umständlich (zu viel Wiederholung). Du kannst das auch eleganter machen: 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/sh
# config
name=main
# immediate exit on error
set -e
zipfile=$(readlink -f "../test2/$name.zip")
for dir in folder1/und/so/weiter folder2/und/so/weiter folder3/und/so/weiter; do
( cd "$dir" && zip -r "$zipfile" . )
done
|
Find es zwar nicht optimal aber es tut was es soll da er ja beim Zippen die vorhandene Updatet. Es wird ja dabei nichts überschrieben.
Das stimmt nur, wenn garantiert ist, dass es keine identischen relativen Pfade unterhalb von folder1/und/so/weiter, folder2/und/so/weiter usw. gibt. Ansonsten gehen Dir Daten verloren. Das ist allerdings ein prinzipielles Problem Deines Ansatzes und hat nichts mit zip zu tun. Edit: Quoting korrigiert
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
rklm schrieb: Was ist denn der Grund bzw. Anwendungsfall?
Der Hintergrund ist derer, in meinem anderen Post habe ich versucht ein Skript zu machen das die Ordner als Zip Gepackt werden. Mit der Bedingung das ein bestimmter Name also der Name des Ordners was der Name der Komponente an sich ist gleich der Name der Zip sein soll. Darüber hinhaus sollte aber nur ab einer bestimmten ebene Gepackt werden, da das entpacken später gezielter geschieht durch ein Pascal Skript. Nur um etwas Flexibilität zu haben wenn die Ordner an sich sich ändern oder Updates kommen. Da es auch Ordner geben soll die ausgeschlossen sein sollen weil es zum Beispiel ein Archiv Ordner existiert oder halt wie im Nachfolgenden beispiel was der Grund für diesen Post ist, einfach diese nur in eine Zip sollen statt in verschiedene.
Das stimmt nur, wenn garantiert ist, dass es keine identischen relativen Pfade unterhalb von folder1/und/so/weiter, folder2/und/so/weiter usw. gibt. Ansonsten gehen Dir Daten verloren. Das ist allerdings ein prinzipielles Problem Deines Ansatzes und hat nichts mit zip zu tun.
Was meinst du damit genau? Du musst verstehen, alles was innerhalb von dem Ordner weiter ist, so wie hier im beispiel soll ja gepackt werden. Darin sind halt weiter Ordner die sich auch wieder verzweigen und worin Dateien Liegen. Die Ordner können mehrmals vorkommen aber nur die Ordner. Und danke dir, ich schau mir das mal an in wie weit das auch Produktiv anwendbar ist ohne das was verloren geht. ☺
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
rklm Danke dir, es macht genau was es soll und es geht auch nichts abhanden. ☺ Das einzige was etwas umständlich ist, ist die Pfade immer einzutragen. Läst sich das auch irgendwie mit variablen lösen so das die Zeile 11 nicht Elen Lang ist? Die die Pfade sehen so aus:
folder1/und/so/weiter
folder2/und/weiter
folder3/weiter
Dadurch wird die Zeile 11 extrem lang und unübersichtlich.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
FreeFun schrieb: rklm Danke dir, es macht genau was es soll und es geht auch nichts abhanden. ☺
Eigentlich müsstest Du noch einen separaten Verarbeitungsschritt einbauen, der das sicherstellt. Es können sich ja immer Namen wiederholen. Das ginge, indem man das hier vor der Hauptschleife einfügt: | test -z "$(for dir; do ( cd "$dir" && find -type f -print0 ); done | sort -z | uniq -dz)"
|
Zusammen mit dem set -e führt das zum Abbruch des Skriptes. Etwas hilfreicher ist es mit Fehlermeldung: | if [ -n "$(for dir; do ( cd "$dir" && find -type f -print0 ); done | sort -z | uniq -dz)" ]; then
echo 'ERROR: Duplicate files!' 2>&1
exit 1
fi
|
Oder gleich mit Ausgabe der Liste: | dups="$(for dir; do ( cd "$dir" && find -type f -print0 ); done | sort -z | uniq -dz)"
if [ -n "$dups" ]; then
{
echo 'ERROR: Duplicate files:'
echo -n "$dups" | xargs -r0 printf '%s\n'
} >&2
exit 1
fi
|
Das einzige was etwas umständlich ist, ist die Pfade immer einzutragen. Läst sich das auch irgendwie mit variablen lösen so das die Zeile 11 nicht Elen Lang ist? Die die Pfade sehen so aus:
folder1/und/so/weiter
folder2/und/weiter
folder3/weiter
Dadurch wird die Zeile 11 extrem lang und unübersichtlich.
Du kannst sie natürlich als Kommandozeilenargumente übergeben. Dann schreibst Du Ciao
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
rklm schrieb: Eigentlich müsstest Du noch einen separaten Verarbeitungsschritt einbauen, der das sicherstellt. Es können sich ja immer Namen wiederholen. Das ginge, indem man das hier vor der Hauptschleife einfügt:
Hey rklm, das ist für meinen Anwendungsfall nicht von Nöten da sich keine Namen wiederholen. Die vorherige Variante reicht völlig aus. ☺ Bei der Vorherigen variante nervt doch etwas die Zeile 11:
| for dir in folder1/und/so/weiter folder2/und/weiter folder3/weiter; do
|
Die Zeile wird bei mir unermesslich lang und da eine Variable zu nutzen wäre Praktisch.
Die Pfade die ich angebe haben ausschließlich diese Form:
folder1/und/so/weiter
folder2/und/weiter
folder3/weiter Wie könnte ich das umsetzten? mit Variablen allein gehts halt auch schlecht da er ja den Inhalt nicht so abarbeitet wie wenn ich die Pfade so aufliste wie derzeit.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
FreeFun schrieb: rklm schrieb: Eigentlich müsstest Du noch einen separaten Verarbeitungsschritt einbauen, der das sicherstellt. Es können sich ja immer Namen wiederholen. Das ginge, indem man das hier vor der Hauptschleife einfügt:
Hey rklm, das ist für meinen Anwendungsfall nicht von Nöten da sich keine Namen wiederholen. Die vorherige Variante reicht völlig aus. ☺
Selbst wenn, ist der Check sinnvoll - für den Fall, dass Du mal vergisst, dass Dein Skript diese Beschränkung hat und sich irgendwann eine Dublette einschleicht.
Bei der Vorherigen variante nervt doch etwas die Zeile 11:
Das hattest Du ja bereits angemerkt.
Die Zeile wird bei mir unermesslich lang und da eine Variable zu nutzen wäre Praktisch.
Wieso? Dann wird halt eine andere Zeile "unermesslich lang". Du kannst die Zeile ja auch umbrechen mit einem Backslash am Ende. Aber das kannst Du auch mit der for -Schleife machen.
Die Pfade die ich angebe haben ausschließlich diese Form:
folder1/und/so/weiter
folder2/und/weiter
folder3/weiter
Wo ist da jetzt das Muster? Kann man die Verzeichnisse ggf. auch suchen?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb:
Die Zeile wird bei mir unermesslich lang und da eine Variable zu nutzen wäre Praktisch.
Wieso? Dann wird halt eine andere Zeile "unermesslich lang". Du kannst die Zeile ja auch umbrechen mit einem Backslash am Ende. Aber das kannst Du auch mit der for -Schleife machen.
Die Pfade die ich angebe haben ausschließlich diese Form:
folder1/und/so/weiter
folder2/und/weiter
folder3/weiter
Wo ist da jetzt das Muster? Kann man die Verzeichnisse ggf. auch suchen?
| */*/*/weiter
*/*/weiter
*/weiter
|
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
rklm schrieb: Wo ist da jetzt das Muster? Kann man die Verzeichnisse ggf. auch suchen?
Man könnte nur den Namen des Ordners als Variable anlegen und er sucht dann selbständigt darin bis zum Ordner weiter. So könnte ich oben bei den Variablen eine Liste von Ordner Namen machen und unten im Skript würde dann nach dem Ordner weiter gesucht und alles darin gepackt. Das wäre eine Möglichkeit. Zum Verständnis: folder1 ist rein Fiktiv und würde sowas entsprechen wie der Name einer Komponente. Diese anzugeben macht es etwas einfacher. Darin gibt es halt immer diesen Ordner weiter. In welcher ebene dieser allerdings liegt kann Variieren. Daher war halt auch das Problem mit der Pfad Angabe, ob Absolut oder wie derzeit Relativ also ab dem Verzeichnis wo das Skript gestartet wird. folder1 könnte ja auch mal eine Ebene Tiefer sitzen und dann hat das nicht mehr hin.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Du könntest das so machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/sh
# config
name=main
such=weiter
test $# -eq 0 && exec find -type d -name "$such" -exec /bin/sh "$0" {} +
# immediate exit on error
set -e
zipfile=$(readlink -f "../test2/$name.zip")
for dir in folder1/und/so/weiter folder2/und/so/weiter folder3/und/so/weiter; do
( cd "$dir" && zip -r "$zipfile" . )
done
|
Dann kannst Du die Verzeichnisse entweder manuell übergeben oder Du lässt sie automatisch von find finden.
|
FreeFun
(Themenstarter)
Anmeldungsdatum: 11. August 2016
Beiträge: 58
|
Dein Konstrukt ergibt für mich irgendwie kein sinn. 😲 Wieso sollte es nach dem Ordner weiter suchen ohne Angabe wo er suchen soll? Es sollen ja nur bestimmte Ordner übergeben werden und diese sollte am besten in dem Skript Stehen. Sind ja nicht wenige und wenn mal einer hinzukommt oder einer nicht mit gepackt wird, sollte das schon etwas leicht umsetzbar sein. Zum Beispiel unter dem Bereich # config bei den zwei Variablen, dort eine liste von Ordner Namen die man angeben könnte die dann unten abgearbeitet werden um nur diese zu packen ab dem Ordner weiter!=?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
FreeFun schrieb:
Wieso sollte es nach dem Ordner weiter suchen ohne Angabe wo er suchen soll?
find sucht immer ab dem aktuellen Verzeichnis, wenn man nichts explizit angibt.
Es sollen ja nur bestimmte Ordner übergeben werden und diese sollte am besten in dem Skript Stehen. Sind ja nicht wenige und wenn mal einer hinzukommt oder einer nicht mit gepackt wird, sollte das schon etwas leicht umsetzbar sein.
Du kannst sie doch bei der for -Schleife eintragen. Sonst musst Du das mit der bash ausführen, weil Du ein Array benötigst. Ich sehe da aber nicht den Vorteil: Das Skript ist doch recht kurz und sowieso nur für eine bestimmte Aufgabe. Wo in diesem Skript die Verzeichnisnamen stehen, ist doch wumpe.
Zum Beispiel unter dem Bereich # config bei den zwei Variablen, dort eine liste von Ordner Namen die man angeben könnte die dann unten abgearbeitet werden um nur diese zu packen ab dem Ordner weiter!=?
Wie gesagt, dafür brauchst Du ein Array und dafür brauchst Du die bash oder eine andere Shell, die Arrays kennt.
|