I own two digital cameras: a DSLR (Canon EOS) and a point-and-shoot (Canon IXUS). With my DSLR I usually shoot in RAW mode. The IXUS can only shoot JPGs but (and this is my main application of the IXUS) can take movies in AVI format.

On my computer I use Linux as operating system. In this article I want to describe my digital workflow under Linux: from the pictures and movies on the cameras over the RAW conversion to the organisation of these files on my harddisk. As RAW converter I use Bibblelabs Bibblepro and for the organisation of my pictures and movies the free photo manager jbrout extended with self written plugins.

Why bibble and jbrout?

Usually I avoid to use commercial software especially under Linux. But at the time when I got my DSLR I could not really manage to setup a RAW workflow with free tools. There already have been dcraw and ufraw but I never became comfortable enough with them. I tried bibble and that was it!

The only thing which I'm missing in bibble is the organisation of my pictures. This gap fills jbrout for me. I can easily tag my pictures with keywords and search for them. And as a big plus it is really easy extendible with plugins written in python. For my own needs I wrote some plugins to handle the organisation especially of my RAW pictures and my movies the way I want it to be.

I also tried f-spot but its features overwhelmed my needs, you also need mono and it's not as easy extendible as jbrout.

Other tools

For importing and renaming the pictures and movies I also use these tools:

  1. gphoto2
  2. jhead
  3. exiv2
  4. exiftool


I have two directories for my picture and movie files:

  1. /proj/media/raw for all RAWs, original JPGs and unmodified AVIs
  2. /proj/media/jbrout for scaled down (1600x1200) and in JPG converted versions of all RAWs and JPGs and also AVIs and their thumbnails

They both have the same structure, e.g.:

michael@piccolo ~ $ ls -1 /proj/media/raw/2006
michael@piccolo ~ $ ls -1 /proj/media/jbrout/2006

The JPGs and AVIs (respectively their thumbnails) in /proj/media/jbrout as the name implies are used by jbrout for storing the tag information and also to view either as single files or as slideshows. The scaled down resolution of 1600x1200 of these pictures is enough for me at time of this writing.

The RAWs and original JPGs and AVIs are in this separate directory because this way they can easily be archived and then be deleted on disk. At time of this writing I did not have to archive any old directories because of missing disk space. But I could imagine that my disk gets full in the near future and then I would archive old raw directories (which I would unlikely need anymore for editing) but keep the jbrout versions of them for viewing.

The raw and the jbrout directories are kept in sync by my jbrout plugin rawworkflow.

Naming conventions

I only have two stages for my directory hierarchy:

  1. year as in /proj/media/jbrout/2006
  2. month respectively a special event in that month as in /proj/media/jbrout/2006/03 and /proj/media/jbrout/2006/04_ausflug_zum_ludwigsburger_schloss. In this directory are all the pictures and movies of this month or event.

All my pictures and movies get renamed directly after the import from the camera in this form:

  1. YYYYMMTT-HHMMSS.cr2 for RAW or YYYYMMTT-HHMMSS.jpg for JPG, e.g. 20060331-164725.jpg
  2. YYYYMMTT-HHMMSS-mov.avi for a movie and YYYYMMTT-HHMMSS-mov.jpg for its thumbnail, e.g. 20060331-164738-mov.avi and 20060331-164738-mov.jpg

It is unlikely that pictures taken from my DSLR and my point-and-shoot are shot at the same time. But it is not unlikely that there are shots from my DSLR in the same second. When that should happen then the next picture of the same second gets renamed to YYYYMMTT-HHMMSSa.cr2 respectively YYYYMMTT-HHMMSSb.cr2 and so on.

If I would duplicate a picture for a special variation or something then I would rename that duplicate to YYYYMMTT-HHMMSS-1.cr2 respectively YYYYMMTT-HHMMSS-2.cr2 and so on.


As an example I shot a picture with my DSLR and a picture and a movie with my point-and-shoot. For the import of these I use these scripts:

  1. exifname to rename the pictures based on their exif date. Gets called by the following two scripts.
  2. gphotocopyeos for the pictures from my DSLR
  3. gphotocopyixus for the pictures and movies from my point-and-shoot

Let's import the example pictures and the movie:

michael@piccolo ~ $ gphotocopyeos
Downloading 'IMG_9618.CR2' from folder '/store_00000001/DCIM/196CANON'...
Saving file as IMG_9618.CR2
    1 image files updated


michael@piccolo ~ $ gphotocopyixus
Downloading 'IMG_1662.JPG' from folder '/store_00010001/DCIM/116CANON'...
Saving file as IMG_1662.JPG
Downloading 'MVI_1663.AVI' from folder '/store_00010001/DCIM/116CANON'...
Saving file as MVI_1663.AVI
Downloading 'IMG_1662.JPG' from folder '/store_00010001/DCIM/116CANON'...
Saving file as thumb_IMG_1662.jpg
Downloading 'MVI_1663.AVI' from folder '/store_00010001/DCIM/116CANON'...
Saving file as thumb_MVI_1663.avi
IMG_1662.JPG --> 20080206-121620.jpg
MVI_1663-mov.jpg --> 20080206-121631.jpg
./MVI_1663-mov.avi --> ./20080206-121631-mov.avi
./20080206-121631.jpg --> ./20080206-121631-mov.jpg


Each gphotocopy script creates a temporary directory where the pictures and movies get downloaded. It's name is printed at the end of each import.

Let's look at these:

michael@piccolo ~ $ ls /proj/media/tmp/bilder_200802061218_eos
michael@piccolo ~ $ ls -1 /proj/media/tmp/bilder_200802061220_ixus

Notice that the thumbnail 20080206-121631-mov.jpg of the movie 20080206-121631-mov.avi has embedded itself as a thumbnail. This was done by the two lines

ln `basename $OHNETHUMB .avi`-mov.jpg `basename $OHNETHUMB .avi`-mov-thumb.jpg
exiv2 -i t `basename $OHNETHUMB .avi`-mov.jpg
in gphotocopyixus. We will need this for jbrout.


Now we have to put the imported files into the appropriate album directories. As these files come from a special event ("myworkflow") I create a new album 2008/02_myworkflow in /proj/media/raw and in /proj/media/jbrout. For this task I use this little script:

mkdir -p /proj/media/raw/$1
mkdir -p /proj/media/jbrout/$1

Now I move all files from the temporary directories /proj/media/tmp/bilder_200802061218_eos and /proj/media/tmp/bilder_200802061220_ixus to /proj/media/raw/2008/02_myworkflow and delete the temporary directories.

michael@piccolo ~ $ ls -1 /proj/media/raw/2008/02_myworkflow


Now I open bibble and batch convert all pictures (RAW and JPG but not the thumbnails of the movies) with default settings to the size 1600x1200 into /proj/media/jbrout/2008/02_myworkflow. For this purpose I have a batch queue in bibble which scales down to 1600x1200 and asks for the destination every time.

At this time I don't care about bad shots or special settings for some pictures. This will be done later in jbrout.

michael@piccolo ~ $ ls -1 /proj/media/jbrout/2008/02_myworkflow


At the time of this writing I do not edit movies. So the original movie (in the raw directory) and the one in the jbrout directory will be the same. To save disk space I use hardlinks:

michael@piccolo ~ $ ln /proj/media/raw/2008/02_myworkflow/*mov* /proj/media/jbrout/2008/02_myworkflow
michael@piccolo ~ $ ls -1 /proj/media/jbrout/2008/02_myworkflow


Now I open jbrout and add /proj/media/jbrout/2008/02_myworkflow as new folder:

Notice that in jbrout only JPGs are visible including the thumbnail of the movie but not the movie itself (which is also in the same folder).

Now it is time to delete the bad shots and to mark the really good shots for further editing. For this task I double click on the first picture in this album to open the fullscreen view mode. In this mode 'Entf' marks for deletion (pictures and/or thumbnails) and 'Space' for further editing (at time of this writing only useful for pictures and not the thumbnails).

After leaving the fullscreen view mode the marked files are deleted. But notice that only the JPGs in the jbrout directory are deleted. The original RAWs, JPGs and AVIs in the raw directory keep untouched. If I am sure that I really want to delete also the original files then I can use 'Sync to Raw' in the Operations menu. It's a function of my plugin rawworkflow.

After that the original files of the deleted jbrout files are moved to a trash folder in the raw directory. If I deleted 20080206-121258.jpg then the trash folder would look like:

michael@piccolo ~ $ ls -1 /proj/media/raw/2008/02_myworkflow/trash

If I am really sure that also the trash folder should be deleted then I can use 'Delete Trash' in the Operations menu.


Now I open the really good shots for further editing in bibble by marking these pictures in jbrout and selecting 'Open in Bibble' in the Operations menu. Bibble should come up with a dynamically created work queue 'jbrout' with the original RAWs respectively JPGs of the selected pictures.

After editing these pictures I batch convert these again but in a different batch queue I called 'jbrout'. This jbrout queue scales the pictures also down to 1600x1200 but has a fixed destination path. For details see rawworkflow. After closing bibble jbrout imports the changed pictures again.


To present pictures and movies on my screen I have two further plugins:


I hope that this article is useful for someone. Write me if you have any annotations.