몇 번 해보니 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개는 포기한다.