For a family event I received photos from about 6 persons, and wanted to view
all of them, sorted by date. The problem was that the timestamps of the files
were sometimes incorrect, and also in all but one cases the exif timestamp was
incorrect as well (but at least that was consistently incorrect, e.g. all
behind of time by 20 mins, etc.)
So first I searched for a photo where a clock is shown, then matched photos by
different authors showing the same action to know the time delta of each
camera. The rest can be scripted: just read the exif info, apply the necessary
time correction based on the camera model, and touch the file with the correct
date. Then any image viewer can show the photos, sorted by date.
Here is the script I came up with:
for i in *.jpg
do
# 2012:01:01 01:01:01 -> 2012-01-01 01:01:01
date=$(exiv2 $i |grep timestamp|sed 's/.* : //'|sed 's/^\([0-9][0-9][0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)/\1-\2-\3/')
# date string -> epoch
unix=$(date --date="$date" +%s)
model=$(exiv2 $i |grep model|sed 's/.*: //')
if [ "$model" == "NIKON D40" ]; then
unix=$(($unix-1320)) # Alice
else
unix=$(($unix+3600)) # Bob
fi
# epoch -> date string
date=$(python -c "import time; print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime($unix))")
# profit!
touch --date="$date" $i
done
# write back the timestamps to the exif info (thx boobaa)
jhead -dsft *.jpg
And additionally if you don’t want to mess up the settings of the image viewer, you can use:
c=0; for i in $(ls -lhtr *.jpg|sed 's/.* //'); do c=$((c+1)); cp -a $i new/$(printf "%03d" $c).jpg; done
to order filenames based on the file timestamp.