Derweil habe ich noch 15 min Zeit, wo ich dachte, dass du nun meine Zeit beanspruchen wirst - in der gehe ich schon mal parallel auf die anderen Probleme ein, zumal man dann nicht dauernd 5 Posts vom selben Thema in Tabs öffnen muss, wenn das mal alles auf einem Haufen abgeklärt wird.
Ich möchte auch verstehen, welche Fehler deine Varianten beinhalten - drum anschließend (nich zuerst!) folgendes:
Hinweise und Fragen - bitte zitiere dieses Mal den Block und geh den erst mal komplett durch. Damit hier Ordnung und Struktur reinkommt und nicht wieder alles zerreißt.
1. Ordnerangaben
sammlung='{sammlung1}{sammlung2}'
Das geht so nicht und mein Beispiel lautete so:
Zeile 7:
subdir='{,*/}/ordner/sub1/sub2'
Neu: Gelb. D.h., entweder ohne was dazwischen (nix vorm Komma) oder irgendwas (ein Ordner) dazwischen (*), abschließend mit "/", damit weitere Ordner danach angehangen werden können.
Dazu ist zu verstehen (darum erkläre ich es nun einmal), dass das aus einem Pfad zwei macht. Sowas kann man zip hinwerfen, weil das mehrere Ordner auf einmal akzeptiert! Das geht aber NICHT in einem Pfad $sammlung/..., den du unten mit cd betreten willst - denn dann weiß ja cd gar nicht, wohin es wechseln soll. Man muss also immer das ganze Programm betrachten. Aber so lernst du es als Crashkurs - mit Crashs. 😉
2. md5sum (Reihenfolge wie im Thema)
Die Variante mit sed muss ich sagen da bin ich mir nicht sicher. Ich hab da viel rum getüftelt aber kommt da nicht weiter wie ich am besten den md5 hash in die Datei reinschreibe an eine bestimmte stelle!
| md5=$(md5sum test2/* | cut -d " " -f 1)
sed 's/comname1.zip=/comname1.zip=$md5/' filelist.txt
|
Das ist jetzt mein Letzter Stand mit dem md5 hash und auch wenn er mir den hash ausgibt ohne den filename sind doch die hashes in einer Zeile. Ich raff einfach nicht wie ich das umsetzten kann das er den hash zu der dazugehörenden Zeile reinschreibt.
Das nützt mir erst was, wenn du mir zeigst, was danach in der Datei steht und was dich daran stört. Also mal zeigen bitte. Ich hab ja derweil andres in deinem Thema zu tun...
Derweil (nach allem folgenden) habe ich auch das mal ausprobiert - siehe deinen Fehler durch meine Verdeutlichung der Ein- und Ausgabe der verschiedenen Varianten selbst:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | $ md5=123
$ echo datei > liste
$ cat liste
datei
$
$ sed "s/datei/datei=$md5/" liste
datei=123
$ cat liste
datei
$
$ sed -i "s/datei/datei=$md5/" liste
$ cat liste
datei=123
$
|
Fragen an dich:
Frage zu meiner dir nun vorschlagenden Alternative: Warum machst du es nicht einfach mit echo?
3.
FreeFun schrieb:
| if [ -d $i ]; then
if [[ -d $i/main/config || -d $i/main/res ]] || [[ -d $sammlung/$i/main/config || -d $sammlung/$i/main/res ]]
then echo "mit config" && cd "$i"/"$subdir" && zip -r "$workdir"/"$i" .
else echo "ohne config" && cd "$i"/"$subdir"/"$version" && zip -r "$workdir"/"$i" .
elif
then echo "mit config" && cd "$sammlung"/"$i"/"$subdir" && zip -r "$workdir"/"$i" .
else echo "ohne config" && cd "$sammlung"/"$i"/"$subdir"/"$version" && zip -r "$workdir"/"$i" .
fi
fi
|
Du hast hier in diesem Ausschnitt in Zeile 5 einsam und allein ein elif geschrieben. Englisch kannst du?
Da steht nun also "andererseits, wenn" und keine Bedingung dazu. Was möchtest du da abprüfen? Nochmal in deinen Worten jetzt an dieser Stelle. Da siehst du ja auch schön den Fehler in deiner Ausgabe:
zip.sh: line 11: syntax error near unexpected token `elif'
zip.sh: line 11: ` elif'
Eindeutiger geht es ja gar nicht mehr. Und warum? Dir sollte dann beim Lernen auffallen, dass du gar keine Bedingung angegeben hast - also was willst du prüfen?
Übrigens verwende ich elif eigentlich gar nicht, sondern es geht ja auch ein
if x; then
y
else if a; then
b
fi
fi
Dann gehört hier aber noch ein schließendes fi dazu. Dein Bedingungskonstrukt scheint aber dort auch in die falsche Richtung zu gehen:
Wenn Bedingung 1, dann ...
Bedingung 2 (auch "Wenn, dann")
Wenn nicht, dann # hier fehlt die Bedingung 3
Bedingung 4
Bedingung 5
Ich würde meinen, du suchst eher sowas:
Wenn Bedingung 1 (Ordner ist a ODER Ordner ist sammlung/a), dann ...
Letztendlich ist deine andere Variante hier besser:
FreeFun schrieb:
Ich wusste nicht wie ich das lösen könnte mit diesem bereich hier:
if [[ -d $i/main/config || -d $i/main/res ]] || [[ -d $sammlung/$i/main/config || -d $sammlung/$i/main/res ]]
then echo "mit config" && cd "$i"/"$subdir" && zip -r "$workdir"/"$i" .
else echo "ohne config" && cd "$i"/"$subdir"/"$version" && zip -r "$workdir"/"$i" .
Das mit $i war schon gut aber ich raff das nicht wie ich da weiter komm bzw. wie ich das umschreiben müsste.
Wenn ich das SO vor mir sehe - es gibt ja viele Wege nach Rom, aber nur manche richtige - wie wäre es dann z.B. damit - du musst das trennen:
| if [[ -d $i/main/config || -d $i/main/res ]]
then echo "mit config" && cd "$i"/"$subdir" && zip -r "$workdir"/"$i" .
else echo "ohne config" && cd "$i"/"$subdir"/"$version" && zip -r "$workdir"/"$i" .
if [[ -d $sammlung/$i/main/config || -d $sammlung/$i/main/res ]]
then ...
else ...
|
Die Zeile also nach unten holen. Denn du willst ja bei vorhandenem sammlung eben was andres machen, mit einem anderen Pfad zippen - sonst bräuchten wir ja nicht prüfen. Wenn du was anderes machen willst, musst du also einfach eine neue Zeile mit einem neuen if nehmen. Da brauchen wir auch kein zusätzliches else if/ else oder so - das verschachtelt nur falsch, weil es oben und unten voneinander abhängig macht und das noch falsch und nur auf Zeile 3,4 und 5 bezogen (also 2 und 6 fehlend). Wir lassen einfach den ersten Block überspringen.
Dann so korrekt passiert folgendes, wenn $sammlung auftaucht:
Die obige Bedingung in Zeile 1-3 wird nicht erfüllt, also wird nix ausgeführt. Wird ignoriert. Das wollen wir.
Stattdessen trifft die Bedingung in Zeile 4 zu und führt dann Zeile 5 und 6 aus. Da kommt dann sowas wie bei Zeile 2-3 oben rein - aber eben an sammlung angepasst.
Nun muss da bei der Variante aber noch ein Ordner rein, der auch existiert. Und selbst du siehst, dass ein
verzeichnis_wo_du_mit_cd_drin_bist_und_script_aufrufst/main/1.2.5
bei deiner Struktur
test/sammlung1/comname1/main/1.2.5
eben nicht existiert. Hinter gelb stimmt es - davor so halb: Davon ausgehend, dass du das script in test ausführst...
du@rechner:~/test$ bash -x script
...würde zumindest noch comname1 von dir unterschlagen worden sein. Das Programm macht genau das, was du ihm sagst. Und das kann man lernen, sowas zu ändern, was man ihm falsch sagte.
4. Die weitere Aufgabe war dann das Ausschließen von Ordnern:
Benno-007 schrieb:
Für die Schleife wäre aber wohl $i zu überprüfen sinnvoller:
| i=xyz; ! [[ $i == "xyz" || $i == "abc" ]] && \
echo mach was, wenn der Ordner, die gerade als i an der Reihe ist, nicht xyz oder abc heißt
|
Das könnte man dann also so machen. Übersetzt in Worte heißt das:
Vorgabe: Ordner i ist xyz. Prüfung: Wenn Ordner ist xyz oder abc, dann (&&) tue, was dahinter bzw. auf der nächsten Zeile steht (\):
echo gibt etwas aus, um zu sehen, ob das so funktioniert
5. Ausblickende Fragen an dich: Denke schon mal drüber nach:
Schlag mir mal je ein, zwei Orte erst mal verbal vor, bevor du es wo einbauen sollst - als Codebeispiel. Und warum. Ich will sehen, was und wie du denkst.
Soweit vorerst von mir. Ich denke, nun kommst du ein ganzes Stück weiter. Ich warte gespannt auf deine Antworten. Wie gesagt, bitte mal strukturiert - notfalls erst mal nur 1. und 2. - 3. und 4. sowie 5. aber dann bald nachreichend, bevor hier zu viel/ vertieft über 1. und 2. diskutiert wird. Das ist in einem Thema sonst zu anstrengend. Das sprengt dann die Möglichkeiten des Forums. (Mehrere Themen für ein Script ist auch nicht praktikabel. Und mehrere Meter zurückscrollen/ warten wollte ich auch nicht. Dafür haben wir nun alles - und das recht weit und kompakt. So dass man das trotz der Komplexität durch die Nummerierung und Reduzierung auch auf einmal beantworten kann.)
Grüße, Benno