몇 번 해보니 gps 좌표가 여러 형식이다. 삼성 카메라로 3개 형식을 얻을 수 있다.
Exif.GPSInfo.GPSLatitude Rational 3 37deg 34' 0.982" Exif.GPSInfo.GPSLatitude Rational 3 37deg 34' 23" Exif.GPSInfo.GPSLatitude Rational 3 35.4328992deg
모두 해당하는 경우를 하나 파일로 만들려 했으나, 틀을 깨어 3개 파일로 만들었다. 1번 파일이 2번 파일을 실행하고, 결과를 확인한다. 만족하지 못하면 3번 파일을 실행한다. 정규 표현식 검증은 여기에서 했다.
#!/bin/bash #1번 스크립트 #echo "hello" echo "$1로 파일 path를 입력" #업데이트할 파일 숫자 확인 #echo $1 iMaxNum=$(wc -l $1 | cut -d' ' -f1) #echo $iMaxNum cat $1 |\ while read tmpFILE; do tmpID=$(echo $tmpFILE | cut -d' ' -f1) tmpPATH=$(echo $tmpFILE | cut -d' ' -f2) #echo $tmpID, $tmpPATH; gpsCoord=$(/home/now0930/script/사진에서정보추출/gpsTextToFloat.sh $tmpPATH) #echo $gpsCoord; #echo $tmpPATH #echo "첫번째 실행" if [ -z "$gpsCoord" ] then gpsCoord=$(/home/now0930/script/사진에서정보추출/gpsTextToFloatMore.sh $tmpPATH) #echo "두번째 실행" #echo $gpsCoord; fi #echo "여기확인" #echo $tmpID, $gpsCoord; gpsCoordLat=$(echo $gpsCoord | cut -d',' -f1) gpsCoordLong=$(echo $gpsCoord | cut -d',' -f2) #float 형식인지 확인하여 mysql update #echo $tmpID #echo $tmpID, $gpsCoordLat, $gpsCoordLong; if ! [ -z "$gpsCoordLat" ] then #데이터 베이스 업데이트 mysql << EOF use myHome; select id, 경로 from picture where id = $tmpID; update picture set gpsLatFloat=$gpsCoordLat, gpsLongFloat=$gpsCoordLong where id=$tmpID; EOF #echo $gpsCoordLat, $gpsCoordLong fi done
#!/bin/bash
#2번 스크립트.
#file 유무 확인
if [ ! -f $1 ];then
echo "file is not there";
exit
fi
#Trap으로 metadata를 가지고 있는지 확인.
#trap "exiv2 -pa $1" EXIT
#echo $1
GpsLat=$(exiv2 -pa $1 2> /dev/null | grep -ae "Exif\.GPSInfo\.GPSLatitude.*Rational" | sed 's/ \{1,\}/ /g' | cut -d' ' -f4-)
GpsLong=$(exiv2 -pa $1 2> /dev/null | grep -ae "Exif\.GPSInfo\.GPSLongitude.*Rational" | sed 's/ \{1,\}/ /g'| cut -d' ' -f4-)
#echo $GpsLat;
#echo $GpsLong;
#printf "\n"
#GpsLat마지막 숫자
GpsLatSec=$(echo $GpsLat | cut -d' ' -f3 | tr -d "\"")
GpsLatMin=$(echo $GpsLat | cut -d' ' -f2 | tr -d "\'")
#초가 없는 경우 0을 입력.
if [ -z "$GpsLatSec" ]
then
GpsLatSec=0;
fi
#echo $GpsLatSec;
#echo $GpsLatMin;
GpsLongSec=$(echo $GpsLong | cut -d' ' -f3 | tr -d "\"")
GpsLongMin=$(echo $GpsLong | cut -d' ' -f2 | tr -d "\'")
if [ -z "$GpsLongSec" ]
then
GpsLongSec=0;
fi
#echo $GpsLatSec;
#echo $GpsLatMin;
#echo $GpsLongSec;
#echo $GpsLongMin;
#GPS자표가 숫자인지 확인
re='^[0-9]{1,3}$'
#가끔 소수점도 있음..
re='^[0-9]{1,3}(\.[0-9]{1,5}$|$)'
#if [ -z "$GpsLat" ]
#then
# echo "0,0"
# exit;
#fi
#echo $GpsLatSec, $GpsLongSec
if ! [[ $GpsLatSec =~ $re ]]
then
exit 1;
fi
if ! [[ $GpsLatMin =~ $re ]]
then
exit 1;
fi
GpsLatFloat=$(bc <<< "scale=4;($GpsLatSec/60+$GpsLatMin)/60")
GpsLongFloat=$(bc <<< "scale=4;($GpsLongSec/60+$GpsLongMin)/60")
#echo $GpsLatFloat
#echo $GpsLongFloat
#$Gps 인티저
GpsLatInt=$(echo $GpsLat | cut -d' ' -f1 | tr -d "d-g");
GpsLongInt=$(echo $GpsLong | cut -d' ' -f1 | tr -d "d-g");
#echo $GpsLatInt
#echo $GpsLongInt
#$전체 숫자.
GpsLatFull=$(bc <<< "scale=4;$GpsLatFloat+$GpsLatInt");
GpsLongFull=$(bc <<< "scale=4;$GpsLongFloat+$GpsLongInt");
echo $GpsLatFull,$GpsLongFull;
#!/bin/bash
#Trap으로 metadata를 가지고 있는지 확인.
#trap "exiv2 -pa $1" EXIT
#echo $GpsLat
#echo $GpsLong
#echo "구분자"
#여기 확인..
#GPS 형식 확인
#xxx.xxxxdeg 형식일 경우 처리.
renumberdeg='^[0-9]{1,}\.[0-9]{1,}deg'
if [[ $GpsLat =~ $renumberdeg ]]
then
#echo "여기 매치"
GpsLatFull=$(echo $GpsLat| cut -d'd' -f1)
#echo $GpsLatFull
fi
if [[ $GpsLong =~ $renumberdeg ]]
then
GpsLongFull=$(echo $GpsLong | cut -d'd' -f1)
#echo $GpsLongFull
fi
echo $GpsLatFull,$GpsLongFull;
이렇게 하면 gps 태그 달린 사진을 8개 남기고 입력할 수 있다. 나머지 8개는 포기한다.