staging.inyokaproject.org

Zeitstempel einer Datei setzen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.10 (Yakkety Yak)
Antworten |

caiusjuliuscaesar

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo,

ich möchte gerne bei gescannten Fotodateien den Zeitstempel so setzen, daß er dem jeweiligen Datum (und nicht dem Scandatum) entspricht. Ich habe in den Dateinamen die Aufnahmedaten, so gut es ging, kodiert:

1
2
3
1990-09-09_irgendetwas_oderauchnichts -> Zeitstempel 1990-09-09
1990-09_irgendetwas_oderauchnichts -> Zeitstempel 1990-09-01
1990_irgendetwas_oderauchnichts -> Zeitstempel 1990-01-01

Ich stelle mir nun ein find-Script vor, das einen Dateibaum durchgräbt und in diesem mit touch -d=... und exiftool die neuen Datieinfomationen setzt. Mir bereite es allerdings Schwierigkeiten, auf das Jahr, den Monat oder den Tag im Dateinamen zuzugreifen.

Hat jmd einen Vorschlag?

Grüße,

CJC

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Weiß nicht ob du da unbedingt selbst was basteln musst 😕

Reicht das ExifTool denn nicht?

sinusQ

Avatar von sinusQ

Anmeldungsdatum:
27. Oktober 2010

Beiträge: 193

Hi!

caiusjuliuscaesar schrieb:

Mir bereite es allerdings Schwierigkeiten, auf das Jahr, den Monat oder den Tag im Dateinamen zuzugreifen.

Eine (nicht besonders schöne - vielleicht kann hier ein erfahrener Skripter weiterhelfen ☺ ) Lösung wäre:

 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
$ ls -1
1990_irgendetwas_oderauchnichts
1990-09_irgendetwas_oderauchnichts
1990-09-09_irgendetwas_oderauchnichts

$ cat script.sh
#!/bin/bash

for i in *; do

	jahr=$(echo $i | awk -F\- '{print substr($1,1,4)}')
	monat=$(echo $i | awk -F\- '{print substr($2,1,2)}')
	tag=$(echo $i | awk -F\-  '{print substr($3,1,2)}')
	
	if [ "$monat" == "" ] ; then monat="01"; fi
	if [ "$tag" == "" ] ; then tag="01"; fi
	
	echo $i
	echo "Jahr:" $jahr
	echo "Monat:" $monat
	echo "Tag:" $tag
done

$ ./script.sh
1990_irgendetwas_oderauchnichts
Jahr: 1990
Monat: 01
Tag: 01
1990-09_irgendetwas_oderauchnichts
Jahr: 1990
Monat: 09
Tag: 01
1990-09-09_irgendetwas_oderauchnichts
Jahr: 1990
Monat: 09
Tag: 09

Danach kannst du mit Exiftool weiterarbeiten..

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo,

danke. Ich habe mir jetzt das folgende Skript zusammengebaut. Statt Bevor ich mit exiftool die Zeitstempel verändere habe ich mal folgendes mit "Nur-Ausgaben" versucht. Das Skript rufe ich mit dem Pfad auf dem Dateibaum, der verändert werden soll auf. Bekomme aber vermutlich wegen der geschachtelten ' (Apostrophe) eine Fehlermeldung im ersten awk-Aufruf (zum 2. und 3. kommts dann erst gar nicht.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
find "$1" -type f -name "*.jpg" -exec bash -c '
for f; do
  echo "Datei $f"
  PFAD=${f%/*}
  DATEI=${f##*/}
  echo ${PFAD}
  echo ${DATEI} 

  jahr=$(echo $DATEI | awk -F\- '{print substr($1,1,4)}')
  monat=$(echo $DATEI | awk -F\- '{print substr($2,1,2)}')
  tag=$(echo $DATEI | awk -F\-  '{print substr($3,1,2)}')
	
  if [ "$monat" == "" ] ; then monat="01"; fi
  if [ "$tag" == "" ] ; then tag="01"; fi
	
  echo "Jahr:" $jahr
  echo "Monat:" $monat
  echo "Tag:" $tag


done
' -- {} +

Die Fehlermeldung lautet

1
2
sh ./finddateibaumdatumumstellen /Datei/pfad/
./finddateibaumdatumumstellen: 14: ./finddateibaumdatumumstellen: Syntax error: "(" unexpected

Was ist falsch, vermutlich mit den geschachtelten Apostrophen?

Gruß, CJC

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Fehlen da nicht die Mengenklammern? 😀

sinusQ

Avatar von sinusQ

Anmeldungsdatum:
27. Oktober 2010

Beiträge: 193

Nein, das Problem liegt schon in Zeile 2: Die Variable $f ist leer, daher ist auch $DATEI (und $PFAD) leer. Das siehst du auch daran, dass der Output in Zeile 3 nicht funktioniert ☺

By the way sollte man in Skripten klein geschriebene Variablen verwenden, GROSS werden wg der besseren Unterscheidbarkeit normalerweise nur globale Variablen geschrieben.

Ich hab den Loop etwas angepasst:

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

find "$1" -type f -name "*.jpg" -print0 | while read -d $'\0' f
do
  echo "Datei $f"
  pfad=${f%/*}
  datei=${f##*/}
  #echo ${pfad}
  #echo ${datei} 

  jahr=$(echo $datei | awk -F\- '{print substr($1,1,4)}')
  monat=$(echo $datei | awk -F\- '{print substr($2,1,2)}')
  tag=$(echo $datei | awk -F\-  '{print substr($3,1,2)}')
	
  if [ "$monat" == "" ] ; then monat="01"; fi
  if [ "$tag" == "" ] ; then tag="01"; fi
	
  echo "Jahr:" $jahr
  echo "Monat:" $monat
  echo "Tag:" $tag

done

Output:

$ ./finddateibaumdatumumstellen .
Datei ./1990-09-09_irgendetwas_oderauchnichts.jpg
Jahr: 1990
Monat: 09
Tag: 09
Datei ./1990-09_irgendetwas_oderauchnichts.jpg
Jahr: 1990
Monat: 09
Tag: 01
Datei ./1990_irgendetwas_oderauchnichts.jpg
Jahr: 1990
Monat: 01
Tag: 01

Quelle: https://stackoverflow.com/questions/9612090/how-to-loop-through-file-names-returned-by-find

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Erst einmal danke. Ich hatte mittlerweile die folgende Lösung mir zusammengebastelt, die ich hier nun auch dokumentiere, wer weiß, wer sich dafür interessiert.

 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
39
40
41
42
43
44
45
#!/bin/bash

find "$1" -type f -name "*.jpg" -exec bash -c '
for f; do
  echo "---------------------------------------------------------------------"
  echo "Datei $f"
  PFAD=${f%/*}
  DATEI=${f##*/}
  echo ${PFAD}
  echo ${DATEI} 

  ZEITSTEMPELARRAY=($(echo ${DATEI} | tr "_" "\n"))
  DATUMARRAY=($(echo ${ZEITSTEMPELARRAY[0]} | tr "-" "\n"))
  echo "${#DATUMARRAY[@]}" 
  echo "- Jahr: ${DATUMARRAY[0]} "
  echo "--  Monat: ${DATUMARRAY[1]} "
  echo "--- Tag: ${DATUMARRAY[2]}"

  TT="01"
  MM="01"
  JJJJ="1000"

  if [ "${#DATUMARRAY[@]}" == "3" ] 
    then
    TT=${DATUMARRAY[2]}
    MM=${DATUMARRAY[1]}
    JJJJ=${DATUMARRAY[0]}
  fi
  
  if [ "${#DATUMARRAY[@]}" == "2" ] 
    then
    MM=${DATUMARRAY[1]}
    JJJJ=${DATUMARRAY[0]}
  fi
      
  if [ "${#DATUMARRAY[@]}" == "1" ] 
    then
    JJJJ=${DATUMARRAY[0]}
  fi    

  exiftool -AllDates="${JJJJ}:${MM}:${TT} 12:00:00" -overwrite_original $f
  touch -t ${JJJJ}${MM}${TT}1200.00 $f

done
' -- {} +

Dabei habe ich die Bezeichner der Variablen in Großbuchstaben, ich dachte, das würde man von jeher so für Shellvariablen machen. Jedenfalls funktioniert das Skript.

Danke!

CJC

Antworten |