bash input variables into exiftool meta tag booleans

Started by richardl152, November 13, 2020, 01:12:15 PM

Previous topic - Next topic

richardl152

Hi Phil - apologies if a FAQ,  but I am having real problems getting this syntax to work for three bash functions.     The three are basically recursively searching for images within a GPS tolerance of location and also by time band.   They work for hard coded values but not for bash input variables on a Mac.

Grateful if you could take a look.   Its driving me nuts as Exiftool  reports use of uninitialized value $info{"3"} and no idea why.

An example invocation is


exiftool_recursive_copy_image_by_date test 2019:01:01 2020:12:31


exiftool_recursive_copy_image_by_gps () {
echo "search_name latitude longitude margin 1e-4"
mkdir -p $HOME/TEST/"$1"
exiftool -v  -progress  -if 'abs($gpslatitude# - "$2") < 1e-4 and abs($gpslongitude# - "$3") < "$4"' -o $HOME/TEST/"$1"  -r .

}
export -f exiftool_recursive_copy_image_by_gps


exiftool_recursive_copy_image_by_gps_and_date () {
echo "search_name latitude longitude margin eg 1e-4 greater than date eg 2019:06:01 and 2020:12:31"
mkdir -p $HOME/TEST/"$1"

exiftool  -v -progress -if 'abs($gpslatitude# - "$2") < 1e-4 and abs($gpslongitude# - "$3") < "$4" and $dateTimeOriginal gt "$5" and $dateTimeOriginal lt "$6" ' \
-o $HOME/TEST/"$1"   -r .

}

export -f exiftool_recursive_copy_image_by_gps_and_date


exiftool_recursive_copy_image_by_date () {
echo "search_name then greater than date eg 2019:06:01 and 2020:12:31"
mkdir -p $HOME/TEST/"$1"

exiftool -v -progress  -if '($dateTimeOriginal gt "$2") and ($dateTimeOriginal lt "$3") ' -o $HOME/TEST/"$1"   -r .

}

export -f exiftool_recursive_copy_image_by_date


StarGeek

Bash isn't my strong suit, but I believe the bash variables should be separate from the single quoted parts.  For example, something like this
'abs($gpslatitude# - '"$2"') < 1e-4 and abs($gpslongitude# - '"$3"') < '"$4"

I could be wrong though.
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

richardl152

#2
Many thanks but sadly not - getting syntax error now:



exiftool_recursive_copy_image_by_date () {
echo "search_name then greater than date eg 2019:06:01 and less than date"
mkdir -p $HOME/TEST/"$1"
exiftool -v -progress  -if '($dateTimeOriginal gt '"$2"') and ($dateTimeOriginal lt '"$3"') ' -o $HOME/TEST/"$1"   -r .
}
export -f exiftool_recursive_copy_image_by_date





richardl152

as an update:

exiftool -v -progress  -if '($createdate# gt "2019:01:01") and ($createdate# lt "2020:12:31") ' -o $HOME/TEMP/"$1"   -r .

as a syntax works in a script,  but passing the same values through as $2 and $3 arguments (even enclosing in "" or ''  at the invocation) does not

exiftool -v -progress  -if '($createdate# gt '"$2"') and ($createdate# lt '"$3"') ' -o $HOME/TEMP/.  -r .

Grateful for any help.  I know I'm doing something stupid but running out of combinations of what to try.

richardl152

Solved it !! very obscure but...


exiftool -v -progress  -if '($createdate# gt '\"$2\"') and ($createdate# lt '\"$3\"') ' -o $HOME/TEST/"$1"   -r .



you have to escape the double quotes around the shell variables....   

StarGeek

Ah, yes, I see my mistake.  I wasn't paying attention to the full command and blatantly ignored the gt and lt of your command, which would require quotes.

Out of curiosity, try testing this out to see if it works without having to escape the double quotes
'($createdate# gt "'$2'") and ($createdate# lt "'$3'")'
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

richardl152

(thanks I will check).    In the hope it helps others,  this is the working stand along bash script of the most complex of the expressions from which the others are simpler variants.


#!/bin/bash                                                                                                                                                                               

echo "search_name latitude longitude margin 1e-4 and eg dates 2019:01:01 2020:12:31"

mkdir -p $HOME/TEST/"$1"


exiftool -v  -progress  -if \
         '($createdate# gt '\"$5\"') and ($createdate# lt '\"$6\"')  and  \                                                                                                               
         abs($gpslatitude# - '\"$2\"') < '\"$4\"' and abs($gpslongitude# - '\"$3\"') < '\"$4\"' ' \
         -o $HOME/TEST/"$1"  -r .






richardl152

Quote from: StarGeek on November 14, 2020, 11:13:26 AM
Ah, yes, I see my mistake.  I wasn't paying attention to the full command and blatantly ignored the gt and lt of your command, which would require quotes.

Out of curiosity, try testing this out to see if it works without having to escape the double quotes
'($createdate# gt "'$2'") and ($createdate# lt "'$3'")'

Yes, you are right and it results in much cleaner working code,  thanks!!


#!/bin/bash                                                                                                                                                                               
echo "search_name latitude longitude margin 1e-4 and eg dates 2019:01:01 2020:12:31"

mkdir -p $HOME/TEST/"$1"
exiftool -v  -progress  -if \
         '($createdate# gt "'$5'") and ($createdate# lt "'$6'")  and  \                                                                                                                   
         abs($gpslatitude# - "'$2'") < "'$4'" and abs($gpslongitude# - "'$3'") < "'$4'" ' \
         -o $HOME/TEST/"$1"  -r .





richardl152

#8
My code for GPS comparison refuses to identify correct GPS coordinates (checked with Exiftool).    I must be doing something wrong (Mac) but can't see it.  Grateful if there's anything obviously wrong with the lat/long abs range check.  Did I use the correct tag processing?




#!/bin/bash                                                                                                                                                                                                                                           

mkdir -p  "$HOME/TEMP/GPS_WIDE_""$1""_""$2"

echo "input latitude and longitude" ;

if [ "$#" -ne 2 ]; then
    echo >&2 'Expected two arguments'
    exit 1
fi

exiftool  -if 'abs($GPSLatitude# - "$1") < 1e-2 and abs($GPSLongitude# - "$2") < 1e-2' -o  "/$HOME/TEMP/GPS_WIDE_$1""_""$2" -r .
# I also tried
# exiftool  -if 'abs($gpslatitude# - "$1") < 1e-2 and abs($gpslongitude# - "$2") < 1e-2' -o  "/$HOME/TEMP/GPS_WIDE_$1""_""$2" -r .


StarGeek

Shouldn't that be
$GPSLatitude# - "'$1'"
and
$GPSLongitude# - "'$2'"
?
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

richardl152

yes !!  you are absolutely right, this keeps catching me out,  thank you for your help,  greatly appreciated