ubuntuusers.de

Split(Explode)-Funktion in der Bash

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

caiusjuliuscaesar

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo,

ich würde gern automatisch aus Dateinamen, die ich sukzessive in eine Variable $i einlese, in der Bash Informationen ziehen. Gibt es so etwas wie eine PHP-Explode-Funktion, mit der ich auf die Bestandteile eines Dateinamens zugreifen kann?

Z. B. Zunächst bis zum Dilimiter "_", dann alles, was sich zwischen Punkten befindet usw.?

Gruß, CJC

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

Geht es um exiftool?

schusch

Avatar von schusch

Anmeldungsdatum:
2. September 2008

Beiträge: 324

Wohnort: Berlin

Da gibt es viele Möglichkeiten sed, awk, cut usw.

z.B. cut (nach -f die Spalte, nach -d das Begrenzungszeichen):

$ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 2 -d '.'
blubber
$ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 3 -d '_'
mehr

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

pinguino schrieb:

Geht es um exiftool?

Genau. Ich will aus den Dateinamen, die vielfach, nicht immer, nach dem Schema

jjjj.mm.dd_Bildunterschrift

oder

jjjj.mm_Bildunterschrift

oder

jjjj_Bildunterschrift

aufgebaut sind, das Datum extrahieren und in das entsprechende exif-Feld schreiben, sowie die Bildunterschrift in IPTC.Caption.

Gruß, CJC

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

schusch schrieb:

Da gibt es viele Möglichkeiten sed, awk, cut usw.

z.B. cut (nach -f die Spalte, nach -d das Begrenzungszeichen):

$ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 2 -d '.'
blubber
$ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 3 -d '_'
mehr

Kann uich die cut-Ausgabe in eine Shellvasriable umleiten

etwa:

> $ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 3 -d '_' > $i

deifl

Avatar von deifl

Anmeldungsdatum:
18. August 2006

Beiträge: 132

Wohnort: Esslingen

Kann uich die cut-Ausgabe in eine Shellvasriable umleiten

etwa:

> $ echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 3 -d '_' > $i

Ungetestet 😉:

i=$(echo bla_fasel.blubber.-noch_mehr_fasel.usw. | cut -f 3 -d '_')

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

caiusjuliuscaesar schrieb:

pinguino schrieb:

Geht es um exiftool?

Genau. Ich will aus den Dateinamen, die vielfach, nicht immer, nach dem Schema

jjjj.mm.dd_Bildunterschrift

oder

jjjj.mm_Bildunterschrift

oder

jjjj_Bildunterschrift

aufgebaut sind, das Datum extrahieren und in das entsprechende exif-Feld schreiben, sowie die Bildunterschrift in IPTC.Caption.

Gruß, CJC

hmmm ... das ist sehr komisch. Warum möchtest du das machen? Das Datum, das im Foto gespeichert ist, ist meiner Meinung nach das richtige. Warum möchtest du das Datum, das im Dateinamen ist, in die Metadaten schreiben?

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo,

es handelt sich um gescannte Fotos aus verschiedenen Jahrzehnten. Ich habe teilweise die Daten in den Dateinamen aufgenommen (weil ich es nicht bsser wußte, und weil es das einfachst war).

Jetzt will ich das Datum in den JPG-Header schreiben. Und das möglichst automatisch bei 1000en von gescannten Fotos...

Gruß, CJC

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

Du muß zuerst schauen, wie das Tag des Datums mit einem EXIF-Viewer heißt und anhand dessen "DateTimeOriginal" anpassen. Außerdem würde ich eine Probe in einem Testordner machen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

IFS='
'

for var in `find /home/user/test -name "*.jpg"`

do

var1=` echo "${var##*/}" |  egrep "^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]_.*" | awk -F_ '{print $1}' `

exiftool -w -d %Y:%m:%d %H:%M:%S -DateTimeOriginal="$var1" "$var" > /dev/null 2>&1

var2=` echo "${var##*/}" |  egrep "^[0-9][0-9][0-9][0-9]\.[0-9][0-9]_.*" | awk -F_ '{print $1}' `

exiftool -w -d %Y:%m:%d %H:%M:%S -DateTimeOriginal="$var2" "$var" > /dev/null 2>&1

var3=` echo "${var##*/}" |  egrep "^[0-9][0-9][0-9][0-9]_.*" | awk -F_ '{print $1}' `

exiftool -w -d %Y:%m:%d %H:%M:%S -DateTimeOriginal="$var3" "$var" > /dev/null 2>&1

done

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Die Antwort ist ja Wahnsinn - danke. Werds ausprobieren und ggf. anpassen...

Gruß, CJC

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

also, ich habe das mit dem Tag "DateTimeOriginal" getestet. Es ist aber notwendig, daß du auch eine Uhrzeit angibst, ansonsten kann exiftool die Daten nicht schreiben.

ich habe es so getestet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

IFS='
'

for var in `find /home/user/testordner -maxdepth 1 -name "*.jpg"`

do

var1=` echo "${var##*/}" | awk -F_ '{print $1}' | sed 's/\./\:/g'`

exiftool -w -d %Y:%m:%d %H:%M:%S -DateTimeOriginal="${var1}[[:blank:]]10:00" "$var"

done

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo, nochmal danke. Es wäre super, wenn Du einen Tipp geben könntest, was hier passiert:

1
2
3
4
5
6
7
8
IFS='    // ???
'

echo "${var##*/}"       // ?
awk -F_ '{print $1}'    // ?
sed 's/\./\:/g'         // ?

exiftool ... "${var1}[[:blank:]]10:00" "$var"  // ?

Das Skript funktioniert, allerdings habe ich Dateinamen, die nicht mit vorangestelltem Datum beginnen und trotzdem ein "-" beinhalten. Dann wirft es z. B. bei Bild_143 ein "Bild" aus.

Gruß, CJC

Antworten |