1#!/bin/sh 2# @(#) $Id: exifgrep,v 1.11 2005/07/02 13:10:03 alex Exp $ 3 4# Run 'egrep' on the output of exifprobe -L, massaging the output a la 5# 'list-photo'. Accepts the -var, -export, -num, and '-' options of 6# list_photo; all other options are passed to egrep. 7 8usage() 9{ 10 echo "Usage: exifgrep [-var|-export] [-num] [-r] [-t] [-n] [-c] [egrep-options] egrep-pattern [NOT egrep-pattern] imagefilename[s]" 1>&2 11 exit 1 12} 13 14 15# Create the output format, choosing numerical or "interpreted" values 16# from the exifprobe output lines, and stripping unwanted spaces for 17# "variable" format (while quoting multi-word values). 18 19format() 20{ 21 filename= 22 vars="var nequals nvalue iequals value remainder" 23 case "${nameopt}" in 24 "-n") vars="filename var nequals nvalue iequals value remainder" ;; 25 esac 26 27 while read $vars 28 do 29 case "$filename" in 30 "#") continue ;; 31 "#"*) continue; ;; 32 *"#") continue ;; 33 esac 34 case ${var} in 35 "#") continue ;; 36 "#"*) continue; ;; 37 *"#") continue ;; 38 esac 39 if test 0$dovar -ne 0 40 then 41 if test ${donum} -eq 1 42 then 43 case ${nvalue} in 44 [0-9]*) echo -n "${export}${var}=${nvalue}" ;; 45 *) quote ${var} ${nvalue} ${iequals} ${value} ${remainder};; 46 esac 47 else 48 case "${iequals}" in 49 "") quote ${var} ${nvalue}${value}${remainder} ;; 50 =) quote ${var} ${value} ${remainder} ;; 51 APEX) quote ${var} ${remainder} ;; 52 *) quote ${var} ${nvalue} ${iequals} ${value} ${remainder} ;; 53 esac 54 fi 55 elif test ${donum} -eq 1 56 then 57 case ${nvalue} in 58 "'"*) echo -n "${var}=${nvalue}" 59 case "${iequals}" in 60 "") ;; 61 *) echo -n " ${iequals} ${value} ${remainder}" ;; 62 esac 63 ;; 64 *) case "${var}" in 65 "#") ;; 66 *) echo -n "${var}=${nvalue}" ;; 67 esac 68 ;; 69 esac 70 else 71 echo -n $var $nequals $nvalue $iequals $value $remainder 72 fi 73 case "${filename}" in 74 "") echo ;; 75 *) echo " # ${filename}" ;; 76 esac 77 done 78} 79 80 81# On output, place double-quotes around multi-word values which 82# are not already quoted. This is necessary for 'variable' format. 83# Do not include "commented" material in quoted phrase. 84 85quote() 86{ 87 local inquote 88 89 inquote=0 90 case $# in 91 0) ;; 92 1) echo -n "${export}$1=" ;; 93 2) echo -n "${export}$1=$2" ;; 94 *) case $1 in 95 \#*) echo -n "$1" ;; 96 *) echo -n "${export}$1"= ;; 97 esac 98 shift 99 while test $# -gt 0 100 do 101 case $1 in 102 \'*) echo -n $*; break ;; 103 \#*) case $inquote in 104 1) echo -n "' " ;; 105 esac 106 inquote=0 107 echo -n "$*" 108 break 109 ;; 110 *) case $inquote in 111 0) echo -n "'"; inquote=1 ;; 112 esac 113 echo -n "$1" 114 shift 115 ;; 116 esac 117 done 118 case $inquote in 119 1) echo -n "'" ;; 120 esac 121 ;; 122 esac 123} 124 125exifgrep_imagefind() 126{ 127 local dir 128 129 dir="$*" 130 find ${dir:="."} \ 131 \( \ 132 -iname "*.tiff" -o -iname "*.tiff" -o -iname "*.tiff.Z" \ 133 -o -iname "*.tif" -o -iname "*.tif" -o -iname "*.tif.Z" \ 134 -o -iname "*.jpeg" -o -iname "*.jpeg.gz" -o -iname "*.jpeg.Z" \ 135 -o -iname "*.jpg" -o -iname "*.jpg.gz" -o -iname "*.jpg.Z" \ 136 -o -iname "*.jpe" -o -iname "*.jpe.gz" -o -iname "*.jpe.Z" \ 137 -o -iname "*.kqp" -o -iname "*.kqp.gz" -o -iname "*.kqp.Z" \ 138 -o -iname "*.mrw" -o -iname "*.mrw.gz" -o -iname "*.mrw.Z" \ 139 -o -iname "*.nef" -o -iname "*.nef.gz" -o -iname "*.nef.Z" \ 140 -o -iname "*.orf" -o -iname "*.orf.gz" -o -iname "*.orf.Z" \ 141 -o -iname "*.pef" -o -iname "*.pef.gz" -o -iname "*.pef.Z" \ 142 -o -iname "*.x3f" -o -iname "*.x3f.gz" -o -iname "*.x3f.Z" \ 143 -o -iname "*.dng" -o -iname "*.dng.gz" -o -iname "*.dng.Z" \ 144 -o -iname "*.erf" -o -iname "*.erf.gz" -o -iname "*.erf.Z" \ 145 -o -iname "*.raf" -o -iname "*.raf.gz" -o -iname "*.raf.Z" \ 146 -o -iname "*.cr2" -o -iname "*.cr2.gz" -o -iname "*.cr2.Z" \ 147 -o -iname "*.crw" -o -iname "*.crw.gz" -o -iname "*.crw.Z" \ 148 -o -iname "*.jp2" -o -iname "*.jp2.gz" -o -iname "*.jp2.Z" \ 149 -o -iname "*.k25" -o -iname "*.k25.gz" -o -iname "*.k25.Z" \ 150 -o -iname "*.kdc" -o -iname "*.kdc.gz" -o -iname "*.kdc.Z" \ 151 \) -print 152} 153 154: PROBE=${PROBE:=exifprobe} 155# Gather options first. This is kind of wierd. 156dovar=0 157donum=0 158recursisve=0 159 160export= 161egrep_options= 162vgrep_options= 163pattern= 164notpattern= 165nameopt= 166tagopt= 167coloropt= 168 169while test $# -ge 1 170do 171 case $1 in 172 -var) dovar=1; shift ;; 173 -num) donum=1; shift ;; 174 -c) coloropt="-c" ; shift ;; 175 -n) nameopt="-n"; shift ;; # may need this if reading from stdin 176 -r) recursive=1; shift ;; 177 -t) tagopt="-enN" ; shift ;; 178 -export*) export="export "; dovar=1; shift ;; 179 -h) usage ;; 180 -*) egrep_options="$egrep_options $1"; shift ;; 181 NOT) case "$2" in 182 -f) notpattern="-f $3"; shift; shift; shift; break ;; 183 *) notpattern="$2"; shift; shift; break ;; 184 esac 185 ;; 186 *) pattern=$1; shift 187 case $1 in 188 NOT) case "$2" in 189 -f) notpattern="-f $3"; shift; shift; shift; break ;; 190 *) notpattern="$2"; shift; shift; break ;; 191 esac 192 ;; 193 *) break ;; 194 esac 195 ;; 196 esac 197done 198 199if test $# -lt 1 -a "X${pattern}${notpattern}" = "X" 200then 201 usage 202fi 203 204# This should probably be modified somehow to use xargs. 205case "${recursive}" in 206 1) args=$( exifgrep_imagefind $* ) 207 set -- ${args} 208 ;; 209esac 210 211# All variables are global. 212# If there are no filenames, read from stdin, which is expected to be 213# exifprobe -L output. 214 215case $# in 216 0) egrep ${egrep_options} ${pattern} | format 217 ;; 218 *) case $# in 219 1) ;; 220 *) nameopt="-n" ;; # Use names if more than one file 221 esac 222 case "${notpattern}" in 223 "") ${PROBE} -L ${coloropt} ${nameopt} ${tagopt} $* | egrep ${egrep_options} ${pattern} | format ;; 224 *) case "${pattern}" in 225 "") ${PROBE} -L ${coloropt} ${nameopt} ${tagopt} $* | egrep ${egrep_options} -v ${notpattern} | format ;; 226 *) ${PROBE} -L ${coloropt} ${nameopt} ${tagopt} $* | egrep ${egrep_options} ${pattern} | egrep -v ${notpattern} | format ;; 227 esac 228 ;; 229 esac 230 ;; 231esac 232