Problem mit Shellskript

Hallo zusammen
Ich möchte gerne ca 50.000 Dateien nach einem Schema bearbeiten.
Die Dateien (Bilder) liegen alle in folgender Form vor:

bla1_bla2_bla3.

Die Anzahl der Elemente die durch einen Unterstrich getrennt sind sind unterscheidlich und man kann die Positionen der Unterstriche auch nicht festsetzen.

Mein Ziel ist jede dieser Informationen (bla1-bla3) als Stichwort in den Tag des Bildes zu schreiben.
Das Kommando dazu lautet:
exiftool „-keywords=bla1“ „-keywords=bla2“ „-keywords=bla3“

in der form „-keywords=bla1, bla2, bla3“ funktioniert es leider nicht, da er „bla1, bla2, bla3“ dann als einen String ansieht, und das kann ich dann in dieser Form nicht gebrauchen…

Da ich bisher wenig erfahrungen im Umgang mit Shellskripten habe fehlt mir der Ansatz wie ich anfangen soll den String (den Dateinamen) zu splitten so, dass ich den Aufruf vom exiftool hinbekomme.

Freue mich über jede kleine Hilfe
Gruss Michael

Die Dateien (Bilder) liegen alle in folgender Form vor:

bla1_bla2_bla3.

Die Anzahl der Elemente die durch einen Unterstrich getrennt
sind sind unterscheidlich und man kann die Positionen der
Unterstriche auch nicht festsetzen.

Mein Ziel […]:
exiftool „-keywords=bla1“ „-keywords=bla2“ „-keywords=bla3“

Vielleicht so etwa:

(0) frank@hugin [~/tmp/jail] % ls pics
foo_bar_laber.jpg foobar_bazbar.png laber_ra_bar_ber.gif
(0) frank@hugin [~/tmp/jail] % cat foo.sh
#!/bin/sh

for file in pics/*
do
filename="basename $file |sed 's/.[^.][^.]*$//'"
(
IFS="_"
args=""
echo „Executing for file $file:“
for filepart in $filename
do
args="$args -keywords=$filepart"
done
echo exiftool $args
)
done
(0) frank@hugin [~/tmp/jail] % ./foo.sh
Executing for file pics/foo_bar_laber.jpg:
exiftool -keywords=foo -keywords=bar -keywords=laber
Executing for file pics/foobar_bazbar.png:
exiftool -keywords=foobar -keywords=bazbar
Executing for file pics/laber_ra_bar_ber.gif:
exiftool -keywords=laber -keywords=ra -keywords=bar -keywords=ber
(0) frank@hugin [~/tmp/jail] %

HTH,
Gruss vom Frank.

1000 Dank für das Skript.

Hier ist mal eine Ausgabe des Programms:

michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$ ./exiftool_werweisswas
Executing for file pics/020721_DB_Berlin_Lehrter_Bf_Bericht3.jpeg:
exiftool -keywords=020721 -keywords=DB -keywords=Berlin -keywords=Lehrter -keywords=Bf -keywords=Bericht3

**
Executing for file pics/020901_Felix_Schoeller_Jr_Burg_Gretesch_Dampfspeicherlok_Osnabrück_Tag_h_0902.JPG:
exiftool -keywords=020901 -keywords=Felix -keywords=Schoeller -keywords=Jr -keywords=Burg -keywords=Gretesch -keywords=Dampfspeicherlok -keywords=Osnabrück -keywords=Tag -keywords=h -keywords=0902
basename: zusätzlicher Operand „.JPG“
„basename --help“ gibt weitere Informationen.
**

Executing for file pics/040611_MARIENBAD_O-Bus (2 .JPG:
exiftool
Executing for file pics/050416_3475.JPG:
exiftool -keywords=050416 -keywords=3475
Executing for file pics/050505_EIB_D2.0.001_Dresden-Hbf_.JPG:
exiftool -keywords=050505 -keywords=EIB -keywords=D2.0.001 -keywords=Dresden-Hbf
Executing for file pics/050927_0379.JPG:
exiftool -keywords=050927 -keywords=0379
Executing for file pics/070404_7248.JPG:
exiftool -keywords=070404 -keywords=7248
Executing for file pics/070404_EVAG_628_Erfurt _2.JPG:
exiftool
Executing for file pics/070404_EVAG__Erfurt 50.JPG:
exiftool
Executing for file pics/070406_2878.NEF:
exiftool -keywords=070406 -keywords=2878
Executing for file pics/080512_0366.ORF:
exiftool -keywords=080512 -keywords=0366
Executing for file pics/080802_0524_2.JPG:
exiftool -keywords=080802 -keywords=0524 -keywords=2
Executing for file pics/080803_0029_2.dng:
exiftool -keywords=080803 -keywords=0029 -keywords=2
Executing for file pics/080831_Üstra__Glocksee-Btf_Fest4.NEF:
exiftool -keywords=080831 -keywords=Üstra -keywords= -keywords=Glocksee-Btf -keywords=Fest4
Executing for file pics/081004_CRW_0041.CRW:
exiftool -keywords=081004 -keywords=CRW -keywords=0041
Executing for file pics/CRW_3183.xmp:
exiftool -keywords=CRW -keywords=3183
Executing for file pics/EFW_Lok2_BadNauheim4.JPG:
exiftool -keywords=EFW -keywords=Lok2 -keywords=BadNauheim4
Executing for file pics/F-Strasborg-Altstadt(5.JPG:
exiftool -keywords=F-Strasborg-Altstadt(5
Executing for file pics/F-Strasborg-Altstadt(6.JPG:
exiftool -keywords=F-Strasborg-Altstadt(6
Executing for file pics/SNCF_F-Strasborg_28.JPG:
exiftool -keywords=SNCF -keywords=F-Strasborg -keywords=28
Executing for file pics/keinunterstrich.JPG:
exiftool -keywords=keinunterstrich
**
Executing for file pics/rekursiv:
exiftool
**
michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$

Probleme habe ich bisher an den beiden Stellen gefunden die ich mal mit ** markiert habe.

  1. Aus irgendeinem Grund kommt diese FM mit Baseline
  2. Es wäre schön, wenn alle Ordner unter den Ordner pics auch abgearbeitet würden.
    Könntest du das Skript bitte so verändern, dass das die Zeile nicht nur ausgegeben wird sondern das das exiftool auch arbeiten kann :wink:
    Testweise habe ich das echo in der drittletzten Zeile entfernt, dann habe ich aber nur FMs bekommen:

michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$ ./exiftool_werweisswas
Executing for file pics/020721_DB_Berlin_Lehrter_Bf_Bericht3.jpeg:
exiftool -keywords=020721 -keywords=DB -keywords=Berlin -keywords=Lehrter -keywords=Bf -keywords=Bericht3
Executing for file pics/020901_Felix_Schoeller_Jr_Burg_Gretesch_Dampfspeicherlok_Osnabrück_Tag_h_0902.JPG:
exiftool -keywords=020901 -keywords=Felix -keywords=Schoeller -keywords=Jr -keywords=Burg -keywords=Gretesch -keywords=Dampfspeicherlok -keywords=Osnabrück -keywords=Tag -keywords=h -keywords=0902
basename: zusätzlicher Operand „.JPG“
„basename --help“ gibt weitere Informationen.
Executing for file pics/040611_MARIENBAD_O-Bus (2 .JPG:
exiftool
Executing for file pics/050416_3475.JPG:
exiftool -keywords=050416 -keywords=3475
Executing for file pics/050505_EIB_D2.0.001_Dresden-Hbf_.JPG:
exiftool -keywords=050505 -keywords=EIB -keywords=D2.0.001 -keywords=Dresden-Hbf
Executing for file pics/050927_0379.JPG:
exiftool -keywords=050927 -keywords=0379
Executing for file pics/070404_7248.JPG:
exiftool -keywords=070404 -keywords=7248
Executing for file pics/070404_EVAG_628_Erfurt _2.JPG:
exiftool
Executing for file pics/070404_EVAG__Erfurt 50.JPG:
exiftool
Executing for file pics/070406_2878.NEF:
exiftool -keywords=070406 -keywords=2878
Executing for file pics/080512_0366.ORF:
exiftool -keywords=080512 -keywords=0366
Executing for file pics/080802_0524_2.JPG:
exiftool -keywords=080802 -keywords=0524 -keywords=2
Executing for file pics/080803_0029_2.dng:
exiftool -keywords=080803 -keywords=0029 -keywords=2
Executing for file pics/080831_Üstra__Glocksee-Btf_Fest4.NEF:
exiftool -keywords=080831 -keywords=Üstra -keywords= -keywords=Glocksee-Btf -keywords=Fest4
Executing for file pics/081004_CRW_0041.CRW:
exiftool -keywords=081004 -keywords=CRW -keywords=0041
Executing for file pics/CRW_3183.xmp:
exiftool -keywords=CRW -keywords=3183
Executing for file pics/EFW_Lok2_BadNauheim4.JPG:
exiftool -keywords=EFW -keywords=Lok2 -keywords=BadNauheim4
Executing for file pics/F-Strasborg-Altstadt(5.JPG:
exiftool -keywords=F-Strasborg-Altstadt(5
Executing for file pics/F-Strasborg-Altstadt(6.JPG:
exiftool -keywords=F-Strasborg-Altstadt(6
Executing for file pics/SNCF_F-Strasborg_28.JPG:
exiftool -keywords=SNCF -keywords=F-Strasborg -keywords=28
Executing for file pics/keinunterstrich.JPG:
exiftool -keywords=keinunterstrich
Executing for file pics/rekursiv:
exiftool
michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$
michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$ ./exiftool_werweisswas
Executing for file pics/020721_DB_Berlin_Lehrter_Bf_Bericht3.jpeg:
File not found: -keywords=020721 -keywords=DB -keywords=Berlin -keywords=Lehrter -keywords=Bf -keywords=Bericht3
Executing for file pics/020901_Felix_Schoeller_Jr_Burg_Gretesch_Dampfspeicherlok_Osnabrück_Tag_h_0902.JPG:
File not found: -keywords=020901 -keywords=Felix -keywords=Schoeller -keywords=Jr -keywords=Burg -keywords=Gretesch -keywords=Dampfspeicherlok -keywords=Osnabrück -keywords=Tag -keywords=h -keywords=0902
basename: zusätzlicher Operand „.JPG“
„basename --help“ gibt weitere Informationen.
Executing for file pics/040611_MARIENBAD_O-Bus (2 .JPG:
Syntax: exiftool [OPTIONS] FILE

Consult the exiftool documentation for a full list of options.
Executing for file pics/050416_3475.JPG:
File not found: -keywords=050416 -keywords=3475
Executing for file pics/050505_EIB_D2.0.001_Dresden-Hbf_.JPG:
File not found: -keywords=050505 -keywords=EIB -keywords=D2.0.001 -keywords=Dresden-Hbf
Executing for file pics/050927_0379.JPG:
File not found: -keywords=050927 -keywords=0379
Executing for file pics/070404_7248.JPG:
File not found: -keywords=070404 -keywords=7248
Executing for file pics/070404_EVAG_628_Erfurt _2.JPG:
Syntax: exiftool [OPTIONS] FILE

Consult the exiftool documentation for a full list of options.
Executing for file pics/070404_EVAG__Erfurt 50.JPG:
Syntax: exiftool [OPTIONS] FILE

Consult the exiftool documentation for a full list of options.
Executing for file pics/070406_2878.NEF:
File not found: -keywords=070406 -keywords=2878
Executing for file pics/080512_0366.ORF:
File not found: -keywords=080512 -keywords=0366
Executing for file pics/080802_0524_2.JPG:
File not found: -keywords=080802 -keywords=0524 -keywords=2
Executing for file pics/080803_0029_2.dng:
File not found: -keywords=080803 -keywords=0029 -keywords=2
Executing for file pics/080831_Üstra__Glocksee-Btf_Fest4.NEF:
File not found: -keywords=080831 -keywords=Üstra -keywords= -keywords=Glocksee-Btf -keywords=Fest4
Executing for file pics/081004_CRW_0041.CRW:
File not found: -keywords=081004 -keywords=CRW -keywords=0041
Executing for file pics/CRW_3183.xmp:
File not found: -keywords=CRW -keywords=3183
Executing for file pics/EFW_Lok2_BadNauheim4.JPG:
File not found: -keywords=EFW -keywords=Lok2 -keywords=BadNauheim4
Executing for file pics/F-Strasborg-Altstadt(5.JPG:
File not found: -keywords=F-Strasborg-Altstadt(5
Executing for file pics/F-Strasborg-Altstadt(6.JPG:
File not found: -keywords=F-Strasborg-Altstadt(6
Executing for file pics/SNCF_F-Strasborg_28.JPG:
File not found: -keywords=SNCF -keywords=F-Strasborg -keywords=28
Executing for file pics/keinunterstrich.JPG:
File not found: -keywords=keinunterstrich
Executing for file pics/rekursiv:
Syntax: exiftool [OPTIONS] FILE

Consult the exiftool documentation for a full list of options.
michael@michael-desktop:~/Desktop/scripts/exiftool werweisswas$

Gruss, Michael

michael@michael-desktop:~/Desktop/scripts/exiftool
werweisswas$ ./exiftool_werweisswas
Executing for file
pics/020721_DB_Berlin_Lehrter_Bf_Bericht3.jpeg:
exiftool -keywords=020721 -keywords=DB -keywords=Berlin
-keywords=Lehrter -keywords=Bf -keywords=Bericht3

**
Executing for file
pics/020901_Felix_Schoeller_Jr_Burg_Gretesch_Dampfspeicherlok_Osnabrück_Tag_h_0902.JPG:
exiftool -keywords=020901 -keywords=Felix -keywords=Schoeller
-keywords=Jr -keywords=Burg -keywords=Gretesch
-keywords=Dampfspeicherlok -keywords=Osnabrück -keywords=Tag
-keywords=h -keywords=0902
basename: zusätzlicher Operand „.JPG“
„basename --help“ gibt weitere Informationen.
**

Diese Fehlermeldung kommt nicht hierher, sondern…

Executing for file pics/040611_MARIENBAD_O-Bus (2 .JPG:
exiftool

… hierher. Du hast ein Leerzeichen im file name, sowas ist boese.

exiftool -keywords=keinunterstrich
**
Executing for file pics/rekursiv:
exiftool
**

Ah, das ist ein bug. Der sed string ist flasch, er muss natuerlich s/.[^.][^.]*$// lauten.

Probleme habe ich bisher an den beiden Stellen gefunden die
ich mal mit ** markiert habe.

  1. Aus irgendeinem Grund kommt diese FM mit Baseline

basename. Siehe oben.

  1. Es wäre schön, wenn alle Ordner unter den Ordner pics auch
    abgearbeitet würden.

Naja, dann muss man halt ein find darueber machen. Damit kommt man dann vermutlich auch um die Probleme mit den Leerzeichen rum.

Könntest du das Skript bitte so verändern, […]

Noe. Fuer Auftragsarbeiten nehme ich Geld. Versuch’s einfach mal selber. Bei konkreten Fragen gibt’s konkrete Antworten.

Testweise habe ich das echo in der drittletzten Zeile
entfernt, dann habe ich aber nur FMs bekommen:

Ich weiss nicht, wie man exiftool bedient. Ich koennte mir vorstellen, dass da mindestens noch der Dateiname des zu modifizierenden Bildes fehlt.

Gruss vom Frank.

Könntest du das Skript bitte so verändern, […]

Noe. Fuer Auftragsarbeiten nehme ich Geld. Versuch’s einfach
mal selber. Bei konkreten Fragen gibt’s konkrete Antworten.

Klar, ich finds echt klasse, dass du die soviel Zeit nimmst. Danke dafuer!

Ich weiss nicht, wie man exiftool bedient. Ich koennte mir
vorstellen, dass da mindestens noch der Dateiname des zu
modifizierenden Bildes fehlt.

Genau richtig, den Dateinamen hab ich vergessen gehabt.
Ich hab versucht den Dateinamen ($file) abzufangen, leider verwirrt mich das ganze.

Hier erstmal der veraenderte Code:


#!/bin/sh

for file in pics/*
do
dateiname=$file
echo schleife_innen>>ausgabe
echo $dateiname>>ausgabe
filename="basename $file |sed 's/\.[^.][^.]*$//'"
(
IFS="_"
args=""
echo „Executing for file $file:“
for filepart in $filename
do
args="$args „’“-keywords=$filepart"’""
done
echo schleife_innen_ende>>ausgabe
echo $dateiname>>ausgabe
echo exiftool $args ‚"-overwrite_original"‘ $dateiname
)
done

hier die Datei ausgabe


schleife_innen
pics/050416_3475.JPG
schleife_innen_ende
pics/050416 3475.JPG
schleife_innen
pics/050505_EIB_D2.0.001_Dresden-Hbf_.JPG
schleife_innen_ende
pics/050505 EIB D2.0.001 Dresden-Hbf .JPG
schleife_innen
pics/hallo_welt.txt
schleife_innen_ende
pics/hallo welt.txt

Was mich jetzt wundert ist, dass die Unterstriche auf den Weg verloren gehen.
Ich kann mir leider nicht erklaren wo, da ich ja in den Zeilen zwischen den Testausgaben keine weitere Zuweisung an $dateiname gemacht habe.

Gruss, Michael

Genau richtig, den Dateinamen hab ich vergessen gehabt.
Ich hab versucht den Dateinamen ($file) abzufangen, leider
verwirrt mich das ganze.

Hier erstmal der veraenderte Code:

Formatiere den das naechste mal mit tag. Dann kann man das auch lesen. Ich aendere das mal.

#!/bin/sh

for file in pics/*
do
dateiname=$file
echo schleife_innen>>ausgabe
echo $dateiname>>ausgabe
filename="basename $file |sed 's/\.[^.][^.]*$//'"
(
IFS="_"
args=""
echo „Executing for file $file:“
for filepart in $filename
do
args="$args „’“-keywords=$filepart"’""
done
echo schleife_innen_ende>>ausgabe
echo $dateiname>>ausgabe
echo exiftool $args ‚"-overwrite_original"‘
$dateiname
)
done

hier die Datei ausgabe

schleife_innen
pics/050416_3475.JPG
schleife_innen_ende
pics/050416 3475.JPG
schleife_innen
pics/050505_EIB_D2.0.001_Dresden-Hbf_.JPG
schleife_innen_ende
pics/050505 EIB D2.0.001 Dresden-Hbf .JPG
schleife_innen
pics/hallo_welt.txt
schleife_innen_ende
pics/hallo welt.txt

Was mich jetzt wundert ist, dass die Unterstriche auf den Weg
verloren gehen.
Ich kann mir leider nicht erklaren wo, da ich ja in den Zeilen
zwischen den Testausgaben keine weitere Zuweisung an
$dateiname gemacht habe.

Das liegt daran, dass ich den inter field separator (IFS) auf „_“ geaendert habe. Das echo kriegt jetzt nicht mehr eine Zeichenkette (foo_bar_baz) vorgeworfen, sondern mehrere. Die shell splittet die am IFS auf und gibt sie dem echo als einzelne Parameter (foo, bar und baz). Das kann man verhindern, indem mal der shell sagt, sie soll gefaelligst die Finger von der Zeichenkette lassen, also z.B. durch Anfuehrungszeichen. Aendere die Zeile zu

echo „$dateiname“>>ausgabe

oder noch besser zu

echo „$dateiname“ >>ausgabe

weil Dir das fehlende Leerzeichen frueher oder spaeter mal auf die Fuesse fallen wird.

HTH,
Gruss vom Frank.