staging.inyokaproject.org

Anwendung von find und Variablen

Status: Gelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Hallo,

wir haben hier bereits ein komplexes Thema Skript Backup mit Variablen Unterordnern zu einem Script laufen und lagern diesen Teil mal nach hier aus:

FreeFun schrieb:

Bei der jetzigen Suche sieht das wie folgt aus:

1
2
3
#!/bin/bash
test="$(basename $(cd $(find -type d -name main)/../.. && pwd))"
echo "$test"
USER@rechner:/www/htdocs/USER/test$ bash -x zip2.sh
++++ find -type d -name main
+++ cd ./comname4/main ./sammlung2/comname10/main ./sammlung2/comname15/main ./sammlung2/comname7/main ./sammlung2/comname3/main ./sammlung2/comname5/main ./sammlung2/comname13/main ./sammlung2/comname11/main ./sammlung2/comname12/main ./sammlung2/comname14/main ./sammlung1/comname2/main ./sammlung1/comname6/main ./comname9/main ./comname1/main ./comname8/main/../..
+++ pwd
++ basename /www/htdocs/USER/test/comname4/main
+ test=main
+ echo main
main
USER@rechner:/www/htdocs/USER/test$ 

Was ich getestet habe war lediglich das " " bzw. ' ' einzubauen und ../ zu verschieben aber da kam er gar nicht so weit wie in dieser Ausgabe daher gibts da nix zu zeigen. Das Variable in Variable ist da komm ich nicht mit und will ich auch erstmal gar nicht. Muss ja nicht gleich jetzt in diesem Thema die Ganze Syntax Lernen!

Gibt es bei find das Comand -prune? Ich hab auch sowas getestet hier:

1
2
find -type d \(-path comname8 -o \) -name main - print
find -type d \(-name comanme8 -prune \) -name main - print

Aber das scheint wohl nicht so zu geben. Das hab ich jetzt nur als Example geschrieben da ich gerade überhaupt versuche zu verstehen wie ich in find Variablen unterbringen kann in Verbindung mit pwd.

Dein Problem ist also der Befehl mit find und Variablen - dessen Verständnis brauchst du. Erklärt wurde es, nun musst du es noch selber nachvollziehen: Ich versuch es dir in Einzelteile zerlegen - die musst du verstehen, um damit arbeiten zu können:

Erst mal als Tipp nochmal: Arbeite für solche Kleinteile doch direkt mit dem Terminal:

1
2
$ test="$(basename $(cd $(find -type d -name main)/../.. && pwd))"; echo "$test"
sammlung2

Geht viel direkter und schneller, auch hier zu posten und diskutieren!

Hier brauchen wir keine detaillierten Ausgaben mit bash -x, hier reicht es, sich vorzuarbeiten. Ich hab mich von innen nach außen vorentwickelt und so musst du es beim Zerlegen in Einzelteile auch wieder machen:

Du nimmst erst den innersten Teil, schaust dir die Ausgaben an. Dann hängst du was dran und schaust dir wieder die Ausgaben an. An meinem Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ i="/home/ich/test/zipping/workdir2/sammlung2/comname10"; test="$(basename $(cd $(find "$i" -type d -name main)/../.. && pwd))"; if [[ $test == "workdir2" ]]; then sammlung="."; else sammlung="$test"; fi; echo "$sammlung"
sammlung2

# zerlegst du wie folgt, wenn du es verstehen willst/ musst:

$ i="/home/ich/test/zipping/workdir2/sammlung2/comname10"; test="$(basename $(cd $(find "$i" -type d -name main)/../.. && pwd))"; if [[ $test == "workdir2" ]]; then sammlung="."; else sammlung="$test"; fi; echo "$sammlung"
sammlung2

$ find "$i" -type d -name main
/home/ich/test/zipping/workdir2/sammlung2/comname10/main

$ cd $(find "$i" -type d -name main)/../..
$ pwd
/home/ich/test/zipping/workdir2/sammlung2

$ cd $(find "$i" -type d -name main)/../.. && pwd
/home/ich/test/zipping/workdir2/sammlung2

$ basename $(cd $(find "$i" -type d -name main)/../.. && pwd))
bash: Syntaxfehler beim unerwarteten Wort »)«  ### Fehler beim Testen sind erlaubt!

$ basename $(cd $(find "$i" -type d -name main)/../.. && pwd)
sammlung2

$ test="$(basename $(cd $(find "$i" -type d -name main)/../.. && pwd))"
$ echo "$test"
sammlung2

# Die gewünschten Ausgaben stimmen. Nun testen wir die Bedingungen:

$ if [[ $test == "workdir2" ]]; then sammlung="."; else sammlung="$test"; fi; echo "$sammlung"
sammlung2

$ if [[ $test == "sammlung2" ]]; then sammlung="."; else sammlung="$test"; fi; echo "$sammlung"
.
$ 

# Fazit: Alles funktioniert, von innen nach außen selbst probiert!

Lies und teste das nach - sonst bin ich zum Thema find-Fragen wieder raus.

Zu deiner zweiten Frage: Die man von find listet -prune auf, ja. Du hast aber keine Fehlermeldung und im Befehl sowieso kein Verzeichnis direkt nach dem Wort find angegeben - die Klammern sind auch sinnlos. Und -prune auch, weil das doch laut man Verzeichnisse ausschließt. Müsste man halt mal genau mit Ausgaben sehn - aber von dir kommen zu deiner letzten Frage ja gerade nur unbrauchbare Bruchstücke ohne Erklärungen und Ausgaben.

Grüße, Benno

Benno-007

(Themenstarter)

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Nachtrag:

Ich würde gerne verstehen was track da als Beispiel gemacht hat wie das geht und wie man dies verwenden könnte für Absolute Pfad Angabe!

track@track:~$ find ./-test/verzeichnis -type d -name main -exec bash -c 'basename "${0%/*}"' {} \;
comname1
comname2 

In meinen Beispiel sieht das ja so aus:

1
2
3
#!/bin/bash
test="$(find -type d -name main -exec bash -c 'basename "${0%/*}"' {} \; )"
echo "$test"
USER@rechner:/www/htdocs/USER/test$ bash -x zip2.sh
++ find -type d -name main -exec bash -c 'basename "${0%/*}"' '{}' ';'
+ test='comname4
comname10
comname15
comname7
comname3
comname5
comname13
comname11
comname12
comname14
comname2
comname6
comname9
comname1
comname8'
+ echo 'comname4
comname10
comname15
comname7
comname3
comname5
comname13
comname11
comname12
comname14
comname2
comname6
comname9
comname1
comname8'
comname4
comname10
comname15
comname7
comname3
comname5
comname13
comname11
comname12
comname14
comname2
comname6
comname9
comname1
comname8
USER@rechner:/www/htdocs/USER/test$ 

Dann ersetzt du halt einfach basename durch echo - eben getestet.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Benno-007 schrieb:

1
2
$ test="$(basename $(cd $(find -type d -name main)/../.. && pwd))"; echo "$test"
sammlung2

Es ist ein Problem, dass in einem Verzeichnisbaum mit mehreren Verzeichnissen namens "main" find mehrere Verzeichnisnamen ausgeben wird. Ich würde das eher so machen:

1
test="$(find -type d -name main -exec readlink -fz '{}/../..' \; -quit | xargs -r0 basename)"

Geht viel direkter und schneller, auch hier zu posten und diskutieren!

Stimmt! Immer einzelne Teile schreiben und debuggen und dann erst weiter machen und etwas größeres daraus zusammen bauen.

FreeFun

Avatar von FreeFun

Anmeldungsdatum:
11. August 2016

Beiträge: 58

rklm schrieb:

test="$(find -type d -name main -exec readlink -fz '{}/../..' \; -quit | xargs -r0 basename)"

Stimmt! Immer einzelne Teile schreiben und debuggen und dann erst weiter machen und etwas größeres daraus zusammen bauen.

Wärst du so nett und könntest du mir dies genauer erläutern!

Mein Ziel an sich war es das ich den Absoluten Pfad durch find bekomme bzw. von dem Ordner der vor dem main Ordner ist, für die Variable test=.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

FreeFun schrieb:

rklm schrieb:

test="$(find -type d -name main -exec readlink -fz '{}/../..' \; -quit | xargs -r0 basename)"

Stimmt! Immer einzelne Teile schreiben und debuggen und dann erst weiter machen und etwas größeres daraus zusammen bauen.

Wärst du so nett und könntest du mir dies genauer erläutern!

Der 1. Teil von find wirft ja eine Liste aller main- Verzeichnisse aus:

track@track:~$ find ./-test -type d -name main
./-test/verzeichnis/comname1/main
./-test/verzeichnis/irgendwie/weiter/comname2/main 

Von da aus geht er 2 Verzeichnisebenen hoch: (damit bist Du in dem Verzeichnis oberhalb Deiner comname-Verzeichnisse)

track@track:~$ find ./-test -type d -name main -exec echo '{}/../..' \;
./-test/verzeichnis/comname1/main/../..
./-test/verzeichnis/irgendwie/weiter/comname2/main/../.. 

Das hift Dir aber noch nichts, denn Du willst ja den echten, absoluten Pfad sehen. Deshalb das readlink -f :

track@track:~$ find ./-test -type d -name main -exec readlink -f '{}/../..' \;
/home/track/-test/verzeichnis
/home/track/-test/verzeichnis/irgendwie/weiter 

Nun willst Du aber nicht die ganze Liste in deiner Variablen haben, sondern nur einen Eintrag. Also bricht er mit dem -quit nach dem 1. Fund ab:

track@track:~$ find ./-test -type d -name main -exec readlink -f '{}/../..' \; -quit
/home/track/-test/verzeichnis 

Um daraus den reinen Namen zu erhalten, hat er auf diese Ausgabe jetzt basename angewandt. Dafür hat er xargs angehängt. Damit dies auch sauber geschieht (also sicher gegen Sonderzeichen, Zeilenumbrüche etc. im Pfadnamen), übergibt er den ausgegebenen Pfad als Null-terminierten String (das ist dafür Standard):

track@track:~$ find ./-test -type d -name main -exec readlink -fz '{}/../..' \; -quit  |  xxd
0000000: 2f68 6f6d 652f 7472 6163 6b2f 2d74 6573  /home/track/-tes
0000010: 742f 7665 727a 6569 6368 6e69 7300       t/verzeichnis.
track@track:~$ find ./-test -type d -name main -exec readlink -fz '{}/../..' \; -quit  |  xargs -r0 basename
verzeichnis 

Das macht im Grunde genau das selbe, was ich oben auch schon vorgeschlagen hatte:

find ./-test/verzeichnis -type d -name main -exec bash -c 'basename "${0%/*}"' {} \;

nur eben über einem etwas anderen Weg. (nämlich mit readlink '{}/../..' statt einer Parameter Expansion)

Mein Ziel an sich war es das ich den Absoluten Pfad durch find bekomme bzw. von dem Ordner der vor dem main Ordner ist, für die Variable test=.

Wenn Du meine Lösung oder die von Robert analysierst, siehst Du ja: der absolute Pfad ist zwischendurch durchaus vorhanden. Das ist also nicht das Problem.

Das Problem mit den Variablen ist vielmehr, dass es ein ziemlicher Aufwand ist, die gefundenen Pfade schön sauber der Reihe nach in eine Variable zu bekommen.
(klar geht sowas, aber dann fängst Du an, mit einer while read - Schleife oder Vergleichbarem zu zaubern ! - wie gesagt: es macht nicht wirklich Spaß, und man muss sehr aufpassen, wenn man das sauber machen will.)

Deshalb hatte ich Dir oben ja schon eine andere Lösung vorgeschlagen: nämlich, dass Du für jedes der gefundenen Verzeichnisse ein kleines Skript direkt mit -exec bash -c an das find anhängst. Dann bearbeitest Du damit nämlich immer nur genau 1 Verzeichnis und brauchst Dich um das Auftrennen der Liste überhaupt nicht mehr zu kümmern.

Und Du kannst ja innerhalb dieses Skripts alles basteln was Du brauchst:

track@track:~$ find ./-test/verzeichnis -type d -name main -exec bash -c ' pfad="${0%/*}"; echo "$pfad"; echo "${pfad##*/}"' {} \;
./-test/verzeichnis/comname1
comname1
./-test/verzeichnis/irgendwie/weiter/comname2
comname2 

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

FreeFun schrieb:

rklm schrieb:

test="$(find -type d -name main -exec readlink -fz '{}/../..' \; -quit | xargs -r0 basename)"

Stimmt! Immer einzelne Teile schreiben und debuggen und dann erst weiter machen und etwas größeres daraus zusammen bauen.

Wärst du so nett und könntest du mir dies genauer erläutern!

Siehe tracks sehr ausführliche und gute Erklärung.

Mein Ziel an sich war es das ich den Absoluten Pfad durch find bekomme bzw. von dem Ordner der vor dem main Ordner ist, für die Variable test=.

Warum wurde dann im alten Code basename verwendet? Das liefert niemals den absoluten Namen.

Ich habe mich nicht im Detail mit dem "Rest" des Problems beschäftigt, aber es gibt natürlich mehrere Möglichkeiten, die Verzeichnisse zu verarbeiten, wenn mehrere benötigt werden, z.B.

1
2
3
find -type d -name main -exec readlink -fz '{}/../..' + | sort -uz | xargs -r0 sh -c 'for dir; do
  echo "processing $dir..."
done' --

Der sort stellt sicher, dass jedes Verzeichnis nur genau ein Mal verarbeitet wird, weil es ha mehrere Unterverzeichnisse "main" auf der zweiten Ebene geben kann. Ich habe jetzt auch "+" hinter "-exec" verwendet, damit find weniger Aufrufe von readlink macht - das kann nämlich auch mit mehreren Argumenten umgehen.

FreeFun

Avatar von FreeFun

Anmeldungsdatum:
11. August 2016

Beiträge: 58

So ich lass auch mal von mir jetzt was hören, nicht das ihr denkt ich mach garnichts. ☺

Hab alle Vorschläge von euch geprüft und mich versucht mit diesen vertraut zu machen, was mir natürlich nicht zu 100% gelungen ist daher habt Nachsicht für die ein oder andere Naive Frage.

Am besten hat mir dieser hier gefallen wobei ich diesen auch etwas abändern musste für meine Verzeichnis Struktur. (mit -quit Natürlich nur die erste Ausgabe)

USER@rechner:/www/htdocs/USER/test$ find -type d -name main -exec readlink -f '{}/..' \; -quit
/www/htdocs/USER/test/comname4
/www/htdocs/USER/test/sammlung2/comname10
/www/htdocs/USER/test/sammlung2/comname15
/www/htdocs/USER/test/sammlung2/comname7
/www/htdocs/USER/test/sammlung2/comname3
/www/htdocs/USER/test/sammlung2/comname5
/www/htdocs/USER/test/sammlung2/comname13
/www/htdocs/USER/test/sammlung2/comname11
/www/htdocs/USER/test/sammlung2/comname12
/www/htdocs/USER/test/sammlung2/comname14
/www/htdocs/USER/test/sammlung1/comname2
/www/htdocs/USER/test/sammlung1/comname6
/www/htdocs/USER/test/comname9
/www/htdocs/USER/test/comname1
/www/htdocs/USER/test/comname8
USER@rechner:/www/htdocs/USER/test$ 

Somit bekomme ich den Pfad um später in der Schleife mit cd in das Verzeichnis zu wechseln um es zu Packen. Richtig toll! ☺ Bei allen vorlagen die ich Testen konnte musste ich auch Feststellen das die Syntax echt weit getrieben werden kann.

rklm schrieb:

1
2
3
find -type d -name main -exec readlink -fz '{}/../..' + | sort -uz | xargs -r0 sh -c 'for dir; do
  echo "processing $dir..."
done' --

Der sort stellt sicher, dass jedes Verzeichnis nur genau ein Mal verarbeitet wird, weil es ha mehrere Unterverzeichnisse "main" auf der zweiten Ebene geben kann. Ich habe jetzt auch "+" hinter "-exec" verwendet, damit find weniger Aufrufe von readlink macht - das kann nämlich auch mit mehreren Argumenten umgehen.

Hat natürlich auch seinen vorteil aber die Ausgabe ist nicht ganz passend für den cd Befehl.

Aber neugierig hat mich schon gemacht das man gleich for dir; do so angeben kann. Lässt sich das auch so weit kombinieren das man zwei Variablen raus bekommt durch eine Abfrage mit find?

Zur Veranschaulichung:

1
2
3
4
    if [[ -d $dir/main/config || -d $dir/main/res ]]
      then echo "mit config" && cd "$dir"/"$subdir" && zip -r "$zipdir"/"$name" .
      else echo "ohne config" && cd "$dir"/"$subdir"/"$version" && zip -r "$zipdir"/"$name" .
    fi

Die Variable $dir bekomme ich durch find wie hier oben in meiner Bash Ausgabe, aber ich bräuchte noch eine für $name wie hier jetzt im Beispiel. Diese steht für den Namen des Ordners der vor main ist und der Name der Zip sein soll. Also $name=comname4. Da am ende dann der Komplette find Aufruf in einer extra Schleife davor abgefertigt wird kann ich schlecht mit dir=$(find -type d -name main -exec readlink -f '{}/..' \; -quit) Arbeiten. Zumindest weiß ich nicht ob das so gut ist, getestet habe ich das so:

1
2
3
4
if [ -z "$*" ];
	then dir=$(find -type d -name main -exec readlink -f '{}/..' \; -quit)
	else dir=$(cd $(find -type d -name "$*") && pwd)
fi

Benno-007 du siehst ich hab meine Hausaufgaben gemacht auch wenn das jetzt für Später ist mit $*, gehts hier nur um die Schleife selber da entweder oder jeweils die Festen Variablen $dir und $name ihren Wert bekommen da nach dieser schleife die Richtige Schleife kommt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

FreeFun schrieb:

So ich lass auch mal von mir jetzt was hören, nicht das ihr denkt ich mach garnichts. ☺

Bestimmt nicht.

rklm schrieb:

1
2
3
find -type d -name main -exec readlink -fz '{}/../..' + | sort -uz | xargs -r0 sh -c 'for dir; do
  echo "processing $dir..."
done' --

Der sort stellt sicher, dass jedes Verzeichnis nur genau ein Mal verarbeitet wird, weil es ha mehrere Unterverzeichnisse "main" auf der zweiten Ebene geben kann. Ich habe jetzt auch "+" hinter "-exec" verwendet, damit find weniger Aufrufe von readlink macht - das kann nämlich auch mit mehreren Argumenten umgehen.

Hat natürlich auch seinen vorteil aber die Ausgabe ist nicht ganz passend für den cd Befehl.

Ich weiß nicht, was Du mit cd hier tun möchtest. Deine Verarbeitung muss natürlich da stehen, wo die Ausgabe mittels echo passiert.

Aber neugierig hat mich schon gemacht das man gleich for dir; do so angeben kann. Lässt sich das auch so weit kombinieren das man zwei Variablen raus bekommt durch eine Abfrage mit find?

Das Idiom iteriert über alle Argumente des Skriptes bzw. Shell-Aufrufs. Man bekommt etliche Werte übergeben bis zum dem erlaubten Maximum von Zeichen in einer Kommandozeile bei einem Prozessstart. Du kannst das selbst ausprobieren:

1
2
$ sh -c 'for x; do; echo "$x"; done' -- a
$ sh -c 'for x; do; echo "$x"; done' -- a b 'c d'

Zur Veranschaulichung:

1
2
3
4
    if [[ -d $dir/main/config || -d $dir/main/res ]]
      then echo "mit config" && cd "$dir"/"$subdir" && zip -r "$zipdir"/"$name" .
      else echo "ohne config" && cd "$dir"/"$subdir"/"$version" && zip -r "$zipdir"/"$name" .
    fi

Das Quoting ist etwas seltsam. Außerdem muss man sicherstellen, dass man wieder sauber zurückwechselt oder den cd in eine Subshell auslagert. Außerdem hast Du einen ".." zu viel in den Beispielen, zumindest, wenn man den Code oben anschaut. Eher so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
find -type d -name main -exec readlink -fz '{}/..' + | sort -uz | xargs -r0 sh -c '
zipdir=can/be/a/relative/path

zipdir=$(readlink -f "$zipdir")

for dir; do
  echo "processing $dir..."
  name=$(basename "$dir")

  if [ -d "$dir/main/config" || -d "$dir/main/res" ]; then
    echo "mit config"
    ( cd "$dir/$subdir" && zip -r "$zipdir/$name.zip" . )
  else
    echo "ohne config"
    ( cd "$dir/$subdir/$version" && zip -r "$zipdir/$name.zip" . )
  fi  
done' --

Die Variable $dir bekomme ich durch find wie hier oben in meiner Bash Ausgabe, aber ich bräuchte noch eine für $name wie hier jetzt im Beispiel. Diese steht für den Namen des Ordners der vor main ist und der Name der Zip sein soll.

Was genau meinst Du mit "vor"? Elternverzeichnis? Das steckt doch in $dir. Oder willst Du den Basename davon? Dann siehe oben.

Benno-007

(Themenstarter)

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Auf jeden Fall machen die Codebeispiele missverständliche Erklärungen wie diese hinfällig:

Da am ende dann der Komplette find Aufruf in einer extra Schleife davor abgefertigt wird kann ich schlecht mit dir=$(find -type d -name main -exec readlink -f '{}/..' \; -quit) Arbeiten.

Bei solchen Aussagen geht immer irgendwas in deinem Kopf vor - dem zumindest ich nicht folgen kann. Entweder mangels Nachdenken/ Intelligenz oder weil es keiner versteht, was du im Stillen denkst. Wenn man aber Code sieht, ist es einem egal. 😀

Wie man auch sieht, entwickelt jeder seinen eigenen Stil - es ist aber gut, die Alternativen auch im bisherigen Code zu sehen und nicht immer gleich mit Codes wie "§$%?=)(/&"§$%&/§" zugeballert zu werden. 😀

FreeFun

Avatar von FreeFun

Anmeldungsdatum:
11. August 2016

Beiträge: 58

rklm Ich hatte nur ein Schnippel als Beispiel aus dem Skript zu Veranschaulichung gepostet, sicher fehlte da doch etwas Kontext.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash
version=1.2.5
subdir=main
zipdir=$(cd ../test2 && pwd)
workdir=$(pwd)
if [ -z "$*" ];
	then dir=$(find -type d -name main -exec readlink -f '{}/..' \; -quit); name=$(basename "$dir")
	else dir=$(cd $(find -type d -name "$*") && pwd); name=$(basename "$dir")
fi
  if [[ -d $dir/main/config || -d $dir/main/res ]]
    then echo "mit config" && cd "$dir"/"$subdir" && zip -r "$zipdir"/"$name" .
    else echo "ohne config" && cd "$dir"/"$subdir"/"$version" && zip -r "$zipdir"/"$name" .
  fi
  cd "$workdir"
done

So halb zusammen gebaut sieht das dann so aus, wobei dies noch nicht lauffähig ist. Mir fehlt doch noch das Wissen wie ich diese beiden Schleifen zusammen bekomme. Es wird ja erst geprüft ob $* dort nichts steht, wenn dann mach ein von beiden. Da durch bekommt er die Variablen für die Haupt schleife. Sie Haupt schleife funktioniert soweit tadellos, das mit dem Qouting was du meintest funktioniert bei mir nicht, nur wenn ich es so mache wo oben ansonsten bekomme ich fehler.

zip.sh: line 11: syntax error near unexpected token `('
zip.sh: line 11: `    then echo "mit config" ( cd "$dir/$subdir" && zip -r "$zipdir/$name" . )' 

Und verzeiht mir wenn meine Erklärungen ohne Beispiel Code nicht schlüssig sind, ich weiß es auch nicht besser wie ich was Formulieren soll/kann. Ihr habt mehr Ahnung und beschreibt jegliche Situation viel Detailreicher und schlüssiger.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich bin jetzt zu müd um Dir im Detail zu antworten. Ein paar generelle Hinweise:

  • Gönn Deinem Programm Leerzeilen, das macht lesbarer.

  • Ein Statement pro Zeile, das macht lesbarer.

  • Halt Dich an übliche Konventionen was Einrückungen und Verteilung von Schlüsselwörtern auf Zeilen angeht, das macht lesbarer.

  • Quote ordentlich, das hilft gegen Fehler.

FreeFun

Avatar von FreeFun

Anmeldungsdatum:
11. August 2016

Beiträge: 58

Ich glaube ich bin jetzt an so einem Punkt angekommen wovor track und Benno-007 mich gewahrt haben.

track schrieb:

Das Problem mit den Variablen ist vielmehr, dass es ein ziemlicher Aufwand ist, die gefundenen Pfade schön sauber der Reihe nach in eine Variable zu bekommen.
(klar geht sowas, aber dann fängst Du an, mit einer while read - Schleife oder Vergleichbarem zu zaubern ! - wie gesagt: es macht nicht wirklich Spaß, und man muss sehr aufpassen, wenn man das sauber machen will.)

Nicht nur das ich die Schleifen nicht schön Sauber zusammen bekomme, ich kriege es auch nicht hin das er den find befehl mehrmals macht also der reihe nach durch. (in Zeile 7, da ja wenn nichts angegeben ist er ja alle Verzeichnisse ja abarbeiten muss nacheinander)

Deshalb hatte ich Dir oben ja schon eine andere Lösung vorgeschlagen: nämlich, dass Du für jedes der gefundenen Verzeichnisse ein kleines Skript direkt mit -exec bash -c an das find anhängst. Dann bearbeitest Du damit nämlich immer nur genau 1 Verzeichnis und brauchst Dich um das Auftrennen der Liste überhaupt nicht mehr zu kümmern.

Meintest du das? Ich komm nämlich nicht mehr weiter und weiß nicht wie ich das bewerkstelligen könnte.

Bei Angabe eines Parameters also ./zip.sh comname8 macht er genau das was er soll, er schaut ob die config Ordner existieren und packt dann je nach dem. Funktioniert dahingehen So wie es soll! Naja auch nicht ganz, bei angabe mehrere Parameter mag er die nicht abarbeiten aber das ist ein anderes Problem in einem anderen Thema.

Antworten |