|
(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:
- 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.
- 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 **********************************************************************************
|
| |