(Terug) naar scripts op heeck.nl of heeck.nl

******************************************************************************************
datetagimg

Dit script heb ik geschreven om de fotodatum in de bestandsnaam van een afbeelding te schrijven.
Gebruikt ImageMagick.

Het lost voor mij twee problemen op:
  1. Ik kan foto's van een gebeurtenis op tijd sorteren, ook als ze verschillende toestellen zijn gemaakt en dat gebeurt steeds vaker in het smartphone- en ipadtijdperk.
  2. Ik kan de epoch of unix-datum voor later gebruik, b.v. voor de database van mijn foto-albums, gelijk uit de bestandsnaam halen als ik albums ga samenstellen.
Er wordt per bestand uit de invoer bekeken of dit wel een plaatje is Ún of ImageMagick er iets mee kan. De bestandsnaam wordt door het script aan de voorkant aangevuld met:
JaarJaarJaarJaarMaandMaandDagDagUurUurMinuutMinuutSecondeSeconde_Epoch_

Voorbeeld: IMAG0504.jpg van 18-06-2015 14:42:54 wordt 20150618144254_1434638574_IMAG0504.jpg
Als er geen metadata in het bestand wordt gevonden wordt de bestandsdatum gepakt.

N.B. Dit script moet vanuit de directory met de te bewerken afbeeldingen opgestart worden, bestanden die niet in de cwd staan worden overgeslagen.

Om foute timestamps in afbeeldingen te corrigeren, bijvoorbeeld als de datum/tijd van je camera verkeerd stond, adviseer ik ExifTool van Phil Harvey.

Gebruik: datetagimg.sh [-t voor testmodus] bestandsnaam (of *.jpg, *.*)

01 #!/bin/bash
02 #
03 # Prepend date in human & epoch format to image filename based on metadata in image
04 #
05 # 
06 while [ "$1" != "" ]
07 do
08   if [ "$1" == "-t" ]
09   then
10     # Dry run mode
11     testmode="true"
12     shift
13   fi
14   #test if image is in cwd
15   if [ "`basename $1`" == "$1" ]
16   then
17     #test if file is image according to os
18     test_image=`file -ib "$1" | cut -f1 -d"/"`
19     if [ "$test_image" = "image" ]
20     then
21       #test if file is image that ImageMagick can handle, 
         store metadata in tempfile for later use
22       test_image=$((identify -verbose $1 > /tmp/datetagimg.$$) 2>&1 | grep "@ error")
23       if [ "$test_image" = "" ]
24       then
25         #collect data for catalog use
26         #
27         #creation date for picture (earliest found in metadata)
28         #fallback for missing metadata is timestamp from file
29         lowdatefull=`stat -c %y $1|cut -f1 -d"."`
30         #using --utc prevents 'relative' epoch calculation on local timezone
31         lowdate=`date --utc -d "$lowdatefull" +%s`
32         #read temporary metadatafile created when testing for ImageMagick
33         while read -r line ; do
34           if (( ${#line} > 13 )) # has time, not only datestamp
35           then
36             #using --utc prevents 'relative' epoch calculation on local timezone
37             linedate=`date --utc -d "$line" +%s` 
38             if (( $linedate < $lowdate ))
39             then
40               lowdate=$linedate
41             fi
42           fi
43         done < <(grep -i date /tmp/datetagimg.$$ |cut -f6-7 -d" " | cut -c1-4,6-7,9-10,12-19|
           cut -f1 -d"+" | sed -r 's/^.{8}/& /;:a;') 
44         #
45         humandate=`date --utc -d@"${lowdate}" +%Y%m%d%H%M%S`
46         if [ "$testmode" == "" ]
47         then
48           mv $1 ${humandate}_${lowdate}_$1 && echo -e "$1\t${humandate}_${lowdate}_$1" || 
             echo "file operation on $1 failed"
49         else 
50           echo -e "Test:\t$1\t${humandate}_${lowdate}_$1"
51         fi
52       else
53         echo "$1 cannot be handled by ImageMagick, ignored" 1>&2 
54       fi
55     else
56       echo "$1 is not an image, ignored" 1>&2
57     fi
58   else
59     echo "$1 is not in current directory, ignored" 1>&2
60   fi
61   test_image=""
62   shift
63 done
64 [ -f /tmp/datetagimg.$$ ] && rm /tmp/datetagimg.$$
65 echo "All done, thank you!" 1>&2

21-11-2015
* Begin **********************************************************************************