Estimated read time: 2 minutes
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.