[Digikam-users] Retrieving metadata

Martin Burnicki martin.burnicki at gmx.de
Mon Oct 24 18:55:47 BST 2011

Samuel Ronayette wrote:
> Hello
> is there a way to look for files with a specific value of a field in the
> metadata? For example, I want to search all the photos in my 'Images'
> folder that were taken with a given lens.
> The "advance search" in digikam does not seem to allow me to do so...
> If not possible in digikam, do you know a tool (under linux) that would
> allow me to do so? I installed the "exif" program, but it doesn't see this
> "LensModel" field in the metadata
> (note that the field "LensModel" does appear in the metadata in digikam,
> when I clik on the tab "Notes du fabricant", but not in the "EXIF" tab)

The exiftool program can be used to list all metatags from one or more images. 

When I started to use this program I stumbled across the fact that the program 
distinguishes between "human readable" tag names and "real" tag names. This 
may lead to confusion if you want to list all tags first, and then change one 
of the listed tags, e.g.:

exiftool img_0235.jpg prints (among others):
Lens Model                      : EF-S55-250mm f/4-5.6 IS

Please note the tag name listed above contains spaces. As far as I know there 
is no way to specify a tag name with space(s), if you only want to display a 
specific tag, i.e. what we'll need later.

However, if you call exiftool with parameter -s then it prints the "real tag 
names", e.g.:

exiftool -s img_0235.jpg
LensModel                       : EF-S55-250mm f/4-5.6 IS

So you can use the command

exiftool -LensModel

to print the LensModel tag of every image in the current directory. However, 
as far as I know, there is no way to let exiftool print only the names of 
every image where a specific tag has a given value.

A one-line script can help to do this. e.g.: 

for f in 2011-10-24\ My\ Latest\ Photos/*.jpg ; do exiftool -LensModel "$f"|\
grep -q "EF-S55-250mm" && echo "$f"; done

The script above loops across all .jpg files a given folder, in this 
case "2011-10-24 My Latest Photos" (please note the spaces in the directory 
name have been escaped in the command, i.e. '\ ').

Then "exiftool -LensModel" is used to print the LensModel tag of an image. The 
output is piped to the grep command which checks if the lens model tag 
matches "EF-S55-250mm" (in my case), and if it matches it prints the name of 
the file. In my case the output looks like:

2011-10-24 My Latest Photos/img_0235.jpg
2011-10-24 My Latest Photos/img_0241.jpg
2011-10-24 My Latest Photos/img_0239.jpg

A limitation of the command above arises if you want to check many files which 
are if different nested directories. In this case you can use a 2 step way to 
find all files which have the tag with the given value. First create a list 
of all image files in the specified directory and all directories below:

find "2011-10-24 My Latest Photos" -iname "*.jpg" > files.txt

Then read the file with the image names line by line and check if the named 
image has the tag you are looking for:

while IFS= read -r f; do exiftool -LensModel "$f"|grep -q "EF-S55-250mm" && \ 
echo "$f"; done < files.txt 

In my case the output is:

2011-10-24 My Latest Photos/tmp/img_0241.jpg
2011-10-24 My Latest Photos/tmp/img_0240.jpg
2011-10-24 My Latest Photos/img_0235.jpg
2011-10-24 My Latest Photos/img_0239.jpg
2011-10-24 My Latest Photos/img_0236.jpg

i.e. the latter method als finds images in a different folder and lists the 
file and folder name.

If you have to search a large number of image files then these commands may 
take some time to execute since the exiftool program is launched for each 
images. But anyway, it does what you wants.


More information about the Digikam-users mailing list