tl;dr: A bash script written in 15 minutes imports files as expected!
I was clearing photos off an SD card so that I have space to photograph a friend’s event this evening. Back on Windows, I would let Lightroom handle imports. Darktable is my photo management software of choice, but it leaves files where they are during import:
Importing a folder does not mean that darktable copies your images into another folder. It just means that the images are visible in lighttable and thus can be developed.
I had photos ranging from July last year until this month, so I needed to put them in directories from 2017/07
to 2018/02
. But looking up metadata, copying and pasting seems like a tedious misuse of my time* so I wrote a little script to do so. It is not robust due to some assumptions (eg that the ‘year’ directory already exists) but it got the job done.
#!/bin/bash
# importcanon.sh - import from (mounted) sd card to directories based on date
CARD_BASEDIR="/tmp/canon"
PHOTO_PATH="DCIM/100CANON/"
TARGET_BASEDIR="/home/robert/mounts/storage/photos"
function copy_file_to_dir() {
if [ ! -d "$2" ]; then
echo "$2 does not exist!"
mkdir "$2"
fi
cp "$1" "$2"
}
function determine_import_year_month() {
#echo "exiftool -d "%Y-%m-%d" -S -s -DateTimeOriginal $1"
yearmonth=$(exiftool -d "%Y/%m/" -S -s -DateTimeOriginal "$1")
echo $yearmonth
}
printf "%s%sn" "$CARD_BASEDIR" "$PHOTO_PATH"
i=0
find "$CARD_BASEDIR/$PHOTO_PATH" -type f | while read file
do
ym=$(determine_import_year_month "$file")
copy_file_to_dir "$file" "$TARGET_BASEDIR/$ym"
if let "$i %10 == 0"; then
echo "Processed file $i ($file)"
fi
let i++
done
This uses exiftool
to extract the year and month (in the form YYYY/MM
), and that is used to give a target to cp
.
The enclosing function has a check to see if the directory exists ([ ! -d "$2" ]
) before copying. Using rsync would have achieved the effect of auto-creating a directory if needed, but that i) involves another tool ii) probably slows things down slightly due to invocation time iii) writing it this way let me remind myself of how to check for directory existence.
I still occasionally glance at how to iterate over files in bash, even though there are other ways of doing so!
There is also a little use of modulo in there to print some status output.
Not pretty, glamorous or robust but it got the job done!
*: Golden rule: leave computers to do things that they are good at