Probleme beim Skripten

8schpi

Neuer User
Mitglied seit
14 Jan 2014
Beiträge
10
Punkte für Reaktionen
0
Punkte
0
Hallo Forum,
in meinem ersten Beitrag habe ich von einer Skriptidee geschrieben, die ich mittlerweile fast umgesetzt habe (fast, weil aus meiner Sicht noch nicht perfekt ist).

Der Code sieht zur Zeit so aus: (Benutzung bitte nur mit Kopien von Fotos, ist noch BETA ;-)
Code:
#!/bin/sh
###############################################################
# Variablen
##############################################################
#
# Variablen
#
QUELLORDNER=/pfad/zum/quellordner
ZIELORDNER=/pfad/zum/quellordner
PATH=/pfad/zum/ordner/jhead:$PATH
LOGDATEI=/pfad/zur/logdatei
#
ZAEHLER=0
ZOHNEHEAD=0
#
#
#######################################################################
# Ab hier geht es richtig los...
#######################################################################
#
echo "Logdaten Fotos_sortieren" > $LOGDATEI
#DATEIEN=$(ls $QUELLORDNER/*.jpg)" "$(ls $QUELLORDNER/*.JPG)
DATEIEN=`find $QUELLORDNER -iname "*.jpg" -print`
#
# Bearbeitung der Dateiliste
#
for DATEI in $DATEIEN ; do
  DATEINAME=$(basename $DATEI)
  DATUM=$(jhead $DATEI | grep Date/Time)
  if [ ! $DATUM ] ; then
    ZOHNEHEAD=$ZOHNEHEAD" + 1"
    echo "kein Exifheader bei Datei : "$DATEI >> $LOGDATEI
  else
    ZAEHLER=$ZAEHLER" + 1"
    # Zuweisen der Variablen jahr, monat und tag
    JAHR=`jhead $DATEI | grep Date/Time | cut -c16-19`
    MONAT=`jhead $DATEI | grep Date/Time | cut -c21-22`
    TAG=`jhead $DATEI | grep Date/Time | cut -c24-25`
#
# Feststellen, ob es den Ordner $jahr im Zielordner bereits gibt, falls nicht, wird er angelegt
    if [ ! -d $ZIELORDNER/$JAHR ]; then
      mkdir $ZIELORDNER/$JAHR
    fi
#
# Feststellen, ob es  den Ordner $monat--$tag* im Zielordner/$jahr bereits gibt, falls nicht, wird er angelegt
    if [ ! -e $ZIELORDNER/$JAHR/$MONAT--$TAG* ] && [ ! -d $ZIELORDNER/$JAHR/$MONAT--$TAG* ]; then
# Zielordner nicht vorhanden
      mkdir $ZIELORDNER/$JAHR/$MONAT"--"$TAG
      ZIELORDNERKOMPLETT="$ZIELORDNER/$JAHR/$MONAT--$TAG"
    else
# Zielordner vorhanden
      ZIELORDNERKOMPLETT=$ZIELORDNER/$JAHR/`ls $ZIELORDNER/$JAHR/ | grep $MONAT--$TAG`
    fi
#
# Verschieben des Fotos vom quellordner in den zielordner/$jahr/$monat--$tag*/
# vorhandene Dateien werden mit dem Schalter -n nicht überschrieben (bei zufälliger Namensgleichheit)
    mv -n $QUELLORDNER/$DATEINAME $ZIELORDNERKOMPLETT/$DATEINAME
    echo "Verschieben von : "$QUELLORDNER/$DATEINAME" nach : "$ZIELORDNERKOMPLETT/$DATEINAME >> $LOGDATEI
  fi
done
#
# Logdatei schreiben
#
echo "Letzte Ausführung des Skriptes am : "$(date) >> $LOGDATEI
echo $(expr $ZAEHLER)" Dateien verschoben." >> $LOGDATEI
echo $(expr $ZOHNEHEAD)" Dateien hatten keine ExifHeader und wurden nicht verschoben." >> $LOGDATEI
# Ausgabe der Logdatei zu Debugzwecken
cat $LOGDATEI

Eigentlich funktioniert es so wie es soll:
Es werden Fotos vom Quellordner in den Zielordner verschoben und gemäß dem Exifdatum wird eine Ordnerstruktur angelegt falls nicht vorhanden. Das ist praktisch wenn man mal wieder ewig die Fotos von der Kamera nicht runtergeladen hat.

Leider wirft er mir nach Aufruf von folgende Fehlermeldungen aus:
sh: :: unknown operand
sh: :: unknown operand
sh: :: unknown operand
sh: :: unknown operand
Ich habe jetzt schon so viel probiert, auskommentiert, gemacht und getan, dass ich den Wald vor Bäumen nicht mehr sehe. Ich bekomme die Quelle für die Fehlermeldung nicht raus. Wenn einer von euch da mal draufgucken könnte...
Mein "Testszenario" sieht so aus:
5 Dateien im Quellordner, 3 Dateien *.JPG, 2 Dateien *.jpg (eine davon ohne Exifinfos)

Ich freue mich über jeden Tipp, denn ich weiß mittlerweile nicht mehr, [was ich] || [was ich noch nicht] ausprobiert habe. Zusätzlich bin ich auch für Tipps dankbar, die mir das Debuggen von Skripten oder die Fehlerbehandlung in den Skripten erleichtern. Viele Sachen, die sich im Internet finden, funktionieren unter Freetz nicht (z.B. http://www.pro-linux.de/artikel/2/111/ein-shellskript-template.html) weil dazu eine "bash-shell" erforderlich ist.
 
Ehe man das jetzt alles "Nachverfolgt":
Rufe das Script mit "sh -x <dein Script>" auf, dann solltest du erkennen können, welcher Befehl diese Meldung auslöst.
 
Genau, Aufruf mit sh -x

Zum Skript selbst:
Code:
  if [ ! $DATUM ] ; then
Was soll das tun, bzw. funktioniert es? Vielleicht ist das sogar die Ursache für die Meldung.
Code:
  DATUM=$(jhead $DATEI | grep Date/Time)
  if [ ! $DATUM ] ; then
    ZOHNEHEAD=$ZOHNEHEAD" + 1"
    echo "kein Exifheader bei Datei : "$DATEI >> $LOGDATEI
  else
    ZAEHLER=$ZAEHLER" + 1"
    # Zuweisen der Variablen jahr, monat und tag
    JAHR=`jhead $DATEI | grep Date/Time | cut -c16-19`
    MONAT=`jhead $DATEI | grep Date/Time | cut -c21-22`
    TAG=`jhead $DATEI | grep Date/Time | cut -c24-25`
Der Inhalt von $(jhead $DATEI | grep Date/Time) steht schon in DATUM, warum also in den letzten drei Zeilen nochmal das gleiche Kommando ausführen? Und warum dort mit `` statt $()?
Code:
    if [ ! -e $ZIELORDNER/$JAHR/$MONAT--$TAG* ] && [ ! -d $ZIELORDNER/$JAHR/$MONAT--$TAG* ]; then
Gibt es den Fall, dass der Eintrag nicht existiert (-e), aber gleichzeitig ein Verzeichnis ist (-d)? Was soll der Stern hier?
Code:
      mkdir $ZIELORDNER/$JAHR/$MONAT"--"$TAG
Das ist eine seltsame Stelle, um da Anführungszeichen zu platzieren. Generell solltest Du Dir klar werden, ob Du Leerzeichen in Pfadnamen unterstützen willst oder nicht. Die Anführungszeichen hier sind auf jeden Fall unnötig.
Code:
# Feststellen, ob es  den Ordner $monat--$tag* im Zielordner/$jahr bereits gibt, falls nicht, wird er angelegt
    if [ ! -e $ZIELORDNER/$JAHR/$MONAT--$TAG* ] && [ ! -d $ZIELORDNER/$JAHR/$MONAT--$TAG* ]; then
# Zielordner nicht vorhanden
      mkdir $ZIELORDNER/$JAHR/$MONAT"--"$TAG
      ZIELORDNERKOMPLETT="$ZIELORDNER/$JAHR/$MONAT--$TAG"
    else
# Zielordner vorhanden
      ZIELORDNERKOMPLETT=$ZIELORDNER/$JAHR/`ls $ZIELORDNER/$JAHR/ | grep $MONAT--$TAG`
    fi
Was soll diese Konstruktion, Besonders $TAG* und grep $MONAT--$TAG? Kann hinter TAG noch etwas stehen? Sicher nicht bei Verzeichnissen, die von diesem Skript angelegt wurden.
Den ganzen Block kannst Du mit zwei Zeilen ersetzen:
Code:
      ZIELORDNERKOMPLETT="$ZIELORDNER/$JAHR/$MONAT--$TAG"
      mkdir -p "$ZIELORDNERKOMPLETT"

Beim Durchlesen von man jhead habe ich gesehen, dass jhead die Option -n hat. Dieser Aufruf sollte genau das tun, was Dein Skript tut:
Code:
    jhead -n"$ZIELORDNER/%Y/%m--%d/%f.jpg" "$DATEI"
Wenn man Wert darauf legt, kann man noch die groß/klein Schreibung vom .jpg aus dem ursprünglichen Dateinamen holen.
 
@MaxMuster: Ich bin nicht besonders gut im shell Skripte schreiben. Meine Kenntnisse habe ich wie schon geschrieben durch "Try&Error" und "Googeln" erlangt. Leider ist mir bis dato das "sh -x" noch nicht untergekommen. Der Tipp ist so gut, dass ich mich beim Schreiben schon frage wie ich es bis hier geschafft habe ohne... Vielen Dank für den Tipp.

@RalfFriedl: Auch Dir vielen Dank für den Tipp mit "sh -x" (siehe oben). Danke auch für Deine detaillierten Überlegungen zu meinem Skript:
1. Codezitat:
In der Variablen $DATUM befindet sich an der Stelle das Exifdatum (oder nichts). Wenn kein Exifdatum gesetzt wurde, dann soll der Zähler ZOHNEHEAD um eins erhöht werden und ein entsprechender Logeintrag geschrieben werden, bei vorhandenem Exifdatum ("else") wird der normale Zähler um 1 erhöht und es folgt das, was das Skript eigentlich tun soll.

2. Codezitat:
Du hast Recht, "$(jhead $DATEI | grep Date/Time)" steht schon in DATUM. Ich habe es beim Try&Error mal geändert, weil ich dachte, dass es was mit der Fehlermeldung zu tun haben könnte und hatte vergessen die Änderung rückgängig zu machen. Ich bin mir bewusst, dass ich bezüglich der Verwendung von ", ` und $() außer meinem Bauchgefühl nur Zeit zum ausprobieren mitbringe... (Das war auch schon die Erklärung zu warum `` anstatt $(): bei mir macht fast nur Versuch klug.

3. Codezitat:
Den Fall, dass der Eintrag nicht existiert aber ein Verzeichnis ist, gibt es natürlich nicht. Durch diese Doppelabfrage habe ich eine andere Fehlermeldung eliminiert, die auftrag als der Code noch etwas anders aussah. Ich meine mich zu erinnern, dass irgendein grep meckerte, dass der Eintrag nicht vorhanden sei. Ich glaube auch, dass diese Doppelabfrage jetzt wieder überflüssig ist.

4. Codezitat:
Bezüglich der Anführungszeichen siehe 2. Codezitat. Ich habe es schon geändert. Ich habe zu dem Skripten in der Shell von Freetz bisher z.B. dieses hier gefunden. Ich würde mich über umfangreichere Informationen freuen, die das Skripten in der Freetzshell erläutern (gibt es sowas?).

5. Codezitat:
Dieses Konstrukt soll Folgendes bewirken: Die Fotos erhalten eine Grundordnung. Nachdem das Skript die Grundordnung erstellt hat könnte es sein, dass der Benutzer (ich) einen Fotoordner von "12--31" in "12--31 Silvesterparty" umbenennt. Wenn danach weitere Fotos mit dem Exifdatum "12--31" geladen werden (z.B. von Bekannten eine Woche später, wenn alle wieder ansprechbar sind ;-), dann sollen diese Fotos automatisch in den Ordner "12--31 Silvesterparty einsortiert werden (nur der Part "Monat--Tag" am Anfang ist entscheidend). Das funktioniert soweit ich das getestet habe.

6. + 7. Codezitat:
Jhead kann auch Dateien umbenennen, aber ich möchte auf jeden Fall die unter "5. Codezitat" beschriebene Funktion (nur der Part "Monat--Tag") haben. Fotos ohne Exifdatum sollen auf keinen Fall abgespeichert werden. Bei jhead würden die Fotos des Bekannten von der Silvesterparty in den Ordner "01--07" des darauffolgenden Jahres geschoben (weil jhead das Dateidatum nimmt, falls kein Exifdatum vorhanden).

Außerdem möchte ich dass Skript noch dahingehend erweitern, dass ich Fotos von Bekannten im Fotoeingangsordner im Unterordner "von Bekanntem1" abspeichern kann und diese dann im Zielordner/Jahr/Monat--Tag*/von Bekanntem1 abgespeichert werden. So hab ich das vorher auch schon immer manuell gemacht... und das soll jetzt das Skript übernehmen. Das ganze möchte ich dann unkompliziert aus der Ferne starten (ggf. mit Callmonitor) und als Fotoeingangsordner stelle ich vielleicht noch ein USB Kartenlaufwerk für SD-Karten welches ich über einen HUB verbinde ein. Dann brauche ich nur die SD-Karte einstecken und die Nummer wählen :phone:
Hätte doch was, oder?

Abschließend nochmal sehr, sehr vielen Dank für das intensive Beschäftigen mit meinem Skript. Ich lerne auf jedenfall aus den Tipps und werde schon bei der nächsten Frage schlauer sein.
 
1. Codezitat:
In der Variablen $DATUM befindet sich an der Stelle das Exifdatum (oder nichts). Wenn kein Exifdatum gesetzt wurde, dann soll der Zähler ZOHNEHEAD um eins erhöht werden und ein entsprechender Logeintrag geschrieben werden, bei vorhandenem Exifdatum ("else") wird der normale Zähler um 1 erhöht und es folgt das, was das Skript eigentlich tun soll.
Das hatte ich auch so vermutet. Die Frage war mehr, ob es so funktioniert, wie es geplant ist. Hast Du mit sh -x dazu etwas herausgefunden? In der jetzigen Form wird es bei leerem Datum expandiert zu "if [ ! ]". Vermutlich funktioniert es trotzdem, aber normalerweise würde man es so schreiben, die andere Variante kann bei bestimmten Werten in DATUM seltsame Ergebnisse lieferm:
Code:
if [ -z "$DATUM" ] ; then

Du hast Recht, "$(jhead $DATEI | grep Date/Time)" steht schon in DATUM. Ich habe es beim Try&Error mal geändert, weil ich dachte, dass es was mit der Fehlermeldung zu tun haben könnte und hatte vergessen die Änderung rückgängig zu machen. Ich bin mir bewusst, dass ich bezüglich der Verwendung von ", ` und $() außer meinem Bauchgefühl nur Zeit zum ausprobieren mitbringe... (Das war auch schon die Erklärung zu warum `` anstatt $(): bei mir macht fast nur Versuch klug.
Die Funktion von `` und $() ist die gleiche, nur ist $() übersichtlicher.

3. Codezitat:
Den Fall, dass der Eintrag nicht existiert aber ein Verzeichnis ist, gibt es natürlich nicht. Durch diese Doppelabfrage habe ich eine andere Fehlermeldung eliminiert, die auftrag als der Code noch etwas anders aussah. Ich meine mich zu erinnern, dass irgendein grep meckerte, dass der Eintrag nicht vorhanden sei. Ich glaube auch, dass diese Doppelabfrage jetzt wieder überflüssig ist.

Ich habe zu dem Skripten in der Shell von Freetz bisher z.B. dieses hier gefunden. Ich würde mich über umfangreichere Informationen freuen, die das Skripten in der Freetzshell erläutern (gibt es sowas?).
Es gibt keine spezielle Anleitung zu Freetz Skripten, weil es keine spezielle Freetz Skripte gibt. Der Link ist eine Liste von Konventionen für einheitliches Aussehen, hat aber nichts mit Funktion zu tun. Freetz verwendet die Busybox Shell, die diese sollte kompatibel zur Standard Bourne Shell sein, aber nicht voll kompatibel zur Bash. Man man auch Bash für die Box kompilieren, diese braucht aber mehr Platz.

Dieses Konstrukt soll Folgendes bewirken: Die Fotos erhalten eine Grundordnung. Nachdem das Skript die Grundordnung erstellt hat könnte es sein, dass der Benutzer (ich) einen Fotoordner von "12--31" in "12--31 Silvesterparty" umbenennt. Wenn danach weitere Fotos mit dem Exifdatum "12--31" geladen werden (z.B. von Bekannten eine Woche später, wenn alle wieder ansprechbar sind ;-), dann sollen diese Fotos automatisch in den Ordner "12--31 Silvesterparty einsortiert werden (nur der Part "Monat--Tag" am Anfang ist entscheidend). Das funktioniert soweit ich das getestet habe.
Funktioniert das wirklich auch mit dem Leerzeichen im Namen? Und was ist, wenn es zwei Verzeichnisse gibt, "12--31 Morgens" und "12--31 Abends"?
Ich würde etwas in der Art nehmen:
Code:
ZIELORDNERKOMPLETT="$ZIELORDNER/$JAHR/$MONAT--$TAG"
ZIELORDNERKOMPLETT="$(set -- "$ZIELORDNERKOMPLETT"*; if [ -d "$1"]; then echo "$1"; else echo "$ZIELORDNERKOMPLETT"; fi)"
mkdir -p "$ZIELORDNERKOMPLETT"
Ich habe es nicht getestet, aber es sollte bei einem oder mehreren Verzeichnissen das erste nehmen, ansonsten das Basis-Verzeichnis, und sollte auch mit Leerzeichen zurecht kommen.

6. + 7. Codezitat:
Jhead kann auch Dateien umbenennen, aber ich möchte auf jeden Fall die unter "5. Codezitat" beschriebene Funktion (nur der Part "Monat--Tag") haben. Fotos ohne Exifdatum sollen auf keinen Fall abgespeichert werden. Bei jhead würden die Fotos des Bekannten von der Silvesterparty in den Ordner "01--07" des darauffolgenden Jahres geschoben (weil jhead das Dateidatum nimmt, falls kein Exifdatum vorhanden).
Der 6. Block hat nichts mit jhead zu tun, sondern damit, dass man die Verzeichnisse mit "mkdir -p" anlegen kann, ohne vorher auf das Verzeichnis für das Jahr zu prüfen.

Für das Verzeichnis noch ein Tipp mit sed, damit wird Datum gleich im richtigen Format ausgegeben, oder ist leer, wenn keine passende Zeile gefunden wird.
Code:
DATUM=$(jhead $DATEI | sed -nre 's,Date/Time[^0-9]*([0-9]{4}).([0-9]{2}).([0-9]{2}),\1/\2--\3,p' )
if [ -z "$DATUM" ]; then ... fi
ZIELORDNERKOMPLETT="$ZIELORDNER/$DATUM"
ZIELORDNERKOMPLETT="$(set -- "$ZIELORDNERKOMPLETT"*; if [ -d "$1"]; then echo "$1"; else echo "$ZIELORDNERKOMPLETT"; fi)"
mkdir -p "$ZIELORDNERKOMPLETT"
Das Ergebnis davon ist gleich
 
Hallo,
ich melde mich kurz mit zwei Dingen zurück:

1. Mit dem Befehl jhead und der internen Funktionalität "-n" kann man wie RalfFriedl vorgeschlagen hat mein Skript stark zusammen kürzen. Allerdings muss ein bisschen if sein, weil ich möchte, dass Dateien in evlt. vorhandene Ordner ala "12--31 Silversterparty" verschoben werden, falls dieser vorhanden ist.

2. Die Fehlermeldung "unknown operand" wird durch diese Codezeile hervorgerufen:
Code:
if [ ! -e $ZIELORDNER/$JAHR/$MONAT--$TAG* ]
Der Stern am Ende der Codezeile sollte (vergebt mir meinen jugendlichen Leichtsinn) ein Wildcard sein und alles finden was mit $MONAT--$TAG anfängt. Den Stern als Joker schluckt er an der Stelle wohl nicht. Geht es evtl. mit Regulären Ausdrücken? (da kenne ich mich leider auch nicht besonders aus...) Oder mit welchen Mitteln kann man an der Stelle prüfen ob ein Ordner mit einem bestimmten Namensmuster vorhanden ist?

Danke für einen Tipp.
 
Die Fehlermeldung "unknown operand" wird durch diese Codezeile hervorgerufen:
Mit dem Befehl jhead und der internen Funktionalität "-n" kann man wie RalfFriedl vorgeschlagen hat mein Skript stark zusammen kürzen
Die Funktion von "jhead -n" bringt wenig, wenn Du abweichende Namen für das Verzeichnis verwenden willst. Nimm dann lieber den Ansatz aus meinem vorherigen Beitrag.
Code:
if [ ! -e $ZIELORDNER/$JAHR/$MONAT--$TAG* ]
Der Stern am Ende der Codezeile sollte (vergebt mir meinen jugendlichen Leichtsinn) ein Wildcard sein und alles finden was mit $MONAT--$TAG anfängt.
Das tut er auch, und das wird wohl auch das Problem sein. Es gibt vermutlich mehrere Verzeichnisse für einen Tag. Wie sieht denn die dazugehörige Zeile bei der Ausgabe mit "sh -x" aus?


Den Stern als Joker schluckt er an der Stelle wohl nicht. Geht es evtl. mit Regulären Ausdrücken? (da kenne ich mich leider auch nicht besonders aus...) Oder mit welchen Mitteln kann man an der Stelle prüfen ob ein Ordner mit einem bestimmten Namensmuster vorhanden ist?

Danke für einen Tipp.[/QUOTE]
 
Die Ausgabe von "sh -x" sieht so aus:
Code:
+ [ ! -d /var/media/ftp/uStor01/config/test2/2010 ]
+ [ ! -e /var/media/ftp/uStor01/config/test2/2010/09--20  test
 /var/media/ftp/uStor01/config/test2/2010/09--20test ]
sh: /var/media/ftp/uStor01/config/test2/2010/09--20test: unknown operand

Den vorigen Beitrag will ich gerade durchgehen (, wenn meine Frau mich lässt ;-) )

Edit:
Hat Sie... mein Skript sieht jetzt dank den super Tipps wesentlich entspannter und vor allem kürzer aus:
Code:
#!/bin/sh
###############################################################
# Variablen
##############################################################
#
# Variablen
#
QUELLORDNER=/var/media/ftp/uStor01/config/test1
ZIELORDNER=/var/media/ftp/uStor01/config/test2
PATH=/var/media/ftp/uStor01/config/bin:$PATH
LOGDATEI=/var/media/ftp/uStor01/log/fotos_sortieren.log
#
#
#######################################################################
# Ab hier geht es richtig los...
#######################################################################
#
echo "Logdaten Fotos_sortieren" > $LOGDATEI
echo "Letzte Ausführung des Skriptes am : "$(date) >> $LOGDATEI
#DATEIEN=$(ls $QUELLORDNER/*.jpg)" "$(ls $QUELLORDNER/*.JPG)
DATEIEN=`find $QUELLORDNER -iname "*.jpg" -print`
#
# Abarbeiten der Dateiliste
#
for DATEI in $DATEIEN ; do
  JAHR=`jhead $DATEI | grep Date/Time | cut -c16-19`
  MONAT=`jhead $DATEI | grep Date/Time | cut -c21-22`
  TAG=`jhead $DATEI | grep Date/Time | cut -c24-25`
  ZIELPFAD="$ZIELORDNER/$JAHR/$MONAT--$TAG"
  ZIELPFAD="$(set -- "$ZIELPFAD"*; if [ -d "$1" ]; then echo "$1"; else echo "$ZIELPFAD"; fi)"
  jhead -n"$ZIELPFAD/%f" -exonly $DATEI >> $LOGDATEI
done
#
echo "Inhalt des Quellordners nach Ausführung des Skriptes:" >> $LOGDATEI
echo `ls $QUELLORDNER` >> $LOGDATEI

Und das Beste ist: es kommen keine Fehlermeldungen und es macht was es soll (gut, keine Unmengen an Tests ausgeführt..., aber) vielen Dank nochmal für die Hilfe, RalfFriedl und MaxMuster!
 
Zuletzt bearbeitet:
Noch eine Idee von mir: Rufe "jhead" nicht so "oft" auf, sondern nur einmal. Speichere einmal den String und dann kannst du per "Stringmanipulation" (ich schaue dazu immer hier) die Teilstrings auch direkt nutzen:

Code:
...
# Abarbeiten der Dateiliste
#
for DATEI in $DATEIEN ; do
  FULLDATE=`jhead $DATEI | grep Date/Time`
# Beispielergebnis: FULLDATE="Date/Time    : 2014:01:12 12:23:22"
  JAHR=${FULLDATE:15:4}
  MONAT=${FULLDATE:20:2}
  TAG=${FULLDATE:23:2}
  ZIELPFAD="$ZIELORDNER/$JAHR/$MONAT--$TAG"
  ZIELPFAD="$(set -- "$ZIELPFAD"*; if [ -d "$1" ]; then echo "$1"; else echo "$ZIELPFAD"; fi)"
  jhead -n"$ZIELPFAD/%f" -exonly $DATEI >> $LOGDATEI
done
#
...
 
@MaxMuster: Danke für den Tipp, das hab ich jetzt einfach so geändert:
Code:
  DATUM=`jhead $DATEI | grep Date/Time`
  JAHR=`echo $DATUM | grep cut -c16-19`
  MONAT=`echo $DATUM | grep cut -c21-22`
  TAG=`echo $DATUM | grep cut -c24-25`
 
Die Ausgabe von "sh -x" sieht so aus:
Code:
+ [ ! -d /var/media/ftp/uStor01/config/test2/2010 ]
+ [ ! -e /var/media/ftp/uStor01/config/test2/2010/09--20  test
 /var/media/ftp/uStor01/config/test2/2010/09--20test ]
sh: /var/media/ftp/uStor01/config/test2/2010/09--20test: unknown operand
Wie vermutet sind es zwei Verzeichnisse für das Datum.

@MaxMuster: Danke für den Tipp, das hab ich jetzt einfach so geändert:

Du kannst es auch so schreiben:
Code:
DATUM=$(jhead $DATEI | sed -nre 's,^.*Date/Time[^0-9]*([0-9]{4}).([0-9]{2}).([0-9]{2}).*$,\1/\2--\3,p' )
ZIELPFAD="$ZIELORDNER/$DATUM"
 
@RalfFriedl: Danke auch für die Verkürzung mit sed. Schon klasse, was man mit sed alles machen kann. Da hab ich noch einiges zu lernen ;-)
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.