[Back to main] [Printable version] [Leave a comment]

Unix shell scripts for archiving digital photos in directories by date [Leave a comment]

by Jarno Elonen, 2003-06-17

I tried to archive my photos in directories by theme for a few years and eventually decided that doing it by date is the only sustainable way. Firstly, you will never be satisfied with the categories and secondly, you will later be tearing your hair off trying to remember the shooting dates of the photos after some image editor has stripped of their EXIF tags.

The fact that most digital cameras (like my Canon G1) store the shooting dates inside JPEG files in the EXIF format makes it possible to automatically archive the photos by date right after they are downloaded, which is exactly what the scripts below do. Here's an example of a directory tree they create:

1999
  1999-07
     1999-07-14
       IMG_48324.JPG
       IMG_48325.JPG
       IMG_48326.JPG
     1999-07-17
       IMG_48331.JPG
       IMG_48333.JPG
       IMG_48334.JPG
       IMG_48337.JPG
  ...etc...

move-digiphotos

This bash script (download it) scans EXIF tags from .JPG files in current directory with metacam, creates necessary directories under $BASEDIR and moves the files in them:

#!/bin/bash

# Reads EXIF creation date from all .JPG files in the
# current directory and moves them carefully under
#
#   $BASEDIR/YYYY/YYYY-MM/YYYY-MM-DD/
#
# ...where 'carefully' means that it does not overwrite
# differing files if they already exist and will not delete
# the original file if copying fails for some reason.
#
# It DOES overwrite identical files in the destination directory
# with the ones in current, however.
#
# This script was originally written and put into
# Public Domain by Jarno Elonen <elonen@iki.fi>; in June 2003.
# Feel free to do whatever you like with it.

BASEDIR=/home/jarno/gfx

find -maxdepth 1 -name "*.JPG" | while read x; do
DATE=`metacam "$x" | \
    egrep "^[ \t]*Image Capture Date:" | \
    sed -r "s/Image Capture Date: ([0-9:]*).*/\1/"`
if [ ! -z "$DATE" ];
then
    YEAR=`echo $DATE | sed -r "s/([0-9]*):([0-9]*):([0-9]*)/\\1/"`
    MONTH=`echo $DATE | sed -r "s/([0-9]*):([0-9]*):([0-9]*)/\\2/"`
    DAY=`echo $DATE | sed -r "s/([0-9]*):([0-9]*):([0-9]*)/\\3/"`
    if [ "$YEAR" -gt 0 ] & [ "$MONTH" -gt 0 ] & [ "$DAY" -gt 0 ]
    then
    INSTDIR=${BASEDIR}/${YEAR}/${YEAR}-${MONTH}/${YEAR}-${MONTH}-${DAY}
    install -d "$INSTDIR"
    INSTFILE="$INSTDIR/$x"
    if [ -e "$INSTFILE" ] && ! cmp -s "$x" "$INSTFILE"
    then
        echo "WARNING: '$INSTFILE' exists already and is different from '$x'."
    else
        echo "Moving '$x'"
        cp "$x" "$INSTFILE"
        if ! cmp -s "$x" "$INSTFILE"
        then
        echo "WARNING: copying failed somehow, will not delete original '$x'"
        else
        rm -f "$x"
        fi
    fi
    else
    echo "WARNING: '$x' doesn't contain date."
    fi
else
    echo "WARNING: '$x' doesn't contain date."
fi
done

fetch-digiphotos

The fetch-digiphotos script (download) fetches pictures from a camera through gphoto2 into a temporary directory under $TMPDIR, moves them with move-digiphotos and finally offers to delete them from the camera:

#!/bin/bash

# Downloads pictures from a digital camera using gphoto2,
# moves them with move-digiphotos.sh and optionally deletes
# them from the camera's memory.
#
# This script was originally written and put into
# Public Domain by Jarno Elonen <elonen@iki.fi> in June 2003.
# Feel free to do whatever you like with it.

TMPDIR=/home/jarno/gfx/tmp

if [ ! -d "$TMPDIR" ]; then
echo "*** Error: download directory '$TMPDIR' does not exist, aborting."
exit 1
fi
pushd "$TMPDIR" > /dev/null

gphoto2 -P
if [ $? != 0 ]; then
echo "*** error executing gphoto2, aborting."
popd > /dev/null
exit 1
fi

move-digiphotos

echo
echo -n "Delete pictures from camera? [y/N] "
read x
if [ $x == "y" ]; then
gphoto2 -D
fi
if [ $? != 0 ]; then
echo "Warning: error executing gphoto2."
popd > /dev/null
exit 1
fi

echo "Done."
popd > /dev/null

Notes

These scripts were developed under Debian GNU/Linux but should work on other Unix-like operating systems as well.

Comments on page '/code/misc-notes/digiphoto-archive-script'

Name:
Email (opt):
Message (no HTML support):
Comment type: Public Private (for page author only)
Spam check: + 2 = 8
Email is optional, not visible to other users, and only used for possible replies.
Please note that the comments are not guaranteed to stay on-line. Trivial questions may be removed after answering them. Corrective and additional notes are sometimes integrated into the main article. Thanks and critisicm are welcome, but are pruned away from time to time. Offensive, abusive, distasteful or aggressive messages are of course removed without a second thougt. Messages sometimes disappear for technical reasons and sometimes just because the administrator felt like removing them.