여행 다녀온 후 수천 장의 사진을 정리하는 게 막막하신가요? IMG_1234.jpg 같은 의미 없는 파일명들이 가득한 폴더를 보면 한숨이 나오죠. 이런 사진들을 촬영 장소 이름으로 자동 변경할 수 있다면 얼마나 좋을까요?
macOS 터미널에서 exiftool과 카카오맵 API를 활용하면 사진 속 GPS 정보를 읽어서 실제 주소로 파일명을 바꿀 수 있어요. 서울타워.jpg, 경복궁.jpg처럼 말이에요.
필요한 도구 설치하기
먼저 Homebrew가 설치되어 있어야 해요. 터미널을 열고 다음 명령어로 필요한 도구들을 설치해요.
# exiftool 설치 - 사진 메타데이터 읽기용
brew install exiftool
# jq 설치 - JSON 파싱용
brew install jq
카카오맵 REST API 키도 필요해요. 카카오 개발자센터에서 애플리케이션을 등록하고 REST API 키를 발급받으세요.
GPS 좌표 추출하는 방법
exiftool을 사용하면 사진에서 GPS 정보를 쉽게 뽑아낼 수 있어요. 한 장만 테스트해보려면 이렇게 하세요.
# 기본 GPS 정보 확인
exiftool -gpslatitude -gpslongitude 사진파일.jpg
# 숫자 형태로 깔끔하게 출력
exiftool -gpslatitude -gpslongitude -n 사진파일.jpg
실제로 사용할 때는 -n 옵션을 꼭 붙여야 해요. 이 옵션이 없으면 37°30'15.43"N 같은 형태로 나와서 API에서 사용하기 어려워요. -n을 붙이면 37.504343 같은 십진수로 나와요.
여러 사진을 한 번에 처리하려면 이렇게 해요.
# 폴더 내 모든 jpg 파일의 GPS 정보를 표로 출력
exiftool -T -filename -gpslatitude -gpslongitude -n *.jpg
완성된 쉘스크립트
이제 모든 걸 합쳐서 자동화 스크립트를 만들어볼게요. rename_photos.sh라는 파일을 만들고 아래 내용을 넣어주세요.
#!/bin/bash
# 카카오맵 API 키 설정
API_KEY="여기에_본인의_API_키_입력"
# 사진 폴더 경로 (스크립트 실행 시 입력)
PHOTO_DIR="$1"
# 경로 입력 확인
if [ -z "$PHOTO_DIR" ]; then
echo "사용법: $0 /사진/폴더/경로"
exit 1
fi
# 필요한 도구 설치 확인
if ! command -v exiftool &> /dev/null; then
echo "exiftool이 설치되어 있지 않아요. brew install exiftool로 설치해주세요."
exit 1
fi
if ! command -v jq &> /dev/null; then
echo "jq가 설치되어 있지 않아요. brew install jq로 설치해주세요."
exit 1
fi
# GPS 좌표 추출 함수
get_gps_coords() {
local photo="$1"
local lat=$(exiftool -gpslatitude -n "$photo" | awk -F': ' '{print $2}')
local lon=$(exiftool -gpslongitude -n "$photo" | awk -F': ' '{print $2}')
# GPS 정보가 둘 다 있을 때만 반환
if [ -n "$lat" ] && [ -n "$lon" ]; then
echo "$lat,$lon"
else
echo ""
fi
}
# 카카오맵 역지오코딩 함수
get_address() {
local coords="$1"
local lat=$(echo "$coords" | cut -d',' -f1)
local lon=$(echo "$coords" | cut -d',' -f2)
# 카카오맵 API 호출
local response=$(curl -s -H "Authorization: KakaoAK $API_KEY" \
"https://dapi.kakao.com/v2/local/geo/coord2address.json?x=$lon&y=$lat")
# 주소 추출 (도로명 주소 우선, 없으면 지번 주소)
local road_address=$(echo "$response" | jq -r '.documents[0].road_address.address_name // empty')
local address=$(echo "$response" | jq -r '.documents[0].address.address_name // empty')
# 도로명 주소가 있으면 사용, 없으면 지번 주소 사용
if [ -n "$road_address" ]; then
echo "$road_address"
else
echo "$address"
fi
}
# 안전한 파일명 만들기 함수
make_safe_filename() {
local name="$1"
# 특수문자를 언더스코어로 치환
echo "$name" | sed 's/[^a-zA-Z0-9가-힣 ._-]/_/g' | sed 's/ /_/g'
}
# 메인 처리 시작
echo "사진 처리를 시작해요..."
processed=0
skipped=0
# jpg, jpeg 파일 찾아서 처리
find "$PHOTO_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) | while read -r photo; do
echo "처리 중: $(basename "$photo")"
# GPS 좌표 추출
coords=$(get_gps_coords "$photo")
if [ -n "$coords" ]; then
# 주소 가져오기
address=$(get_address "$coords")
if [ -n "$address" ]; then
# 파일 정보 분리
dir=$(dirname "$photo")
filename=$(basename "$photo")
extension="${filename##*.}"
# 안전한 파일명 생성
safe_name=$(make_safe_filename "$address")
new_name="${safe_name}.${extension}"
new_path="${dir}/${new_name}"
# 중복 파일명 처리
counter=1
while [ -e "$new_path" ]; do
new_name="${safe_name}_${counter}.${extension}"
new_path="${dir}/${new_name}"
((counter++))
done
# 파일명 변경
mv "$photo" "$new_path"
echo " → 변경됨: $new_name"
((processed++))
else
echo " → 주소를 찾을 수 없어요"
((skipped++))
fi
else
echo " → GPS 정보가 없어요"
((skipped++))
fi
done
echo ""
echo "처리 완료!"
echo "변경된 파일: $processed개"
echo "건너뛴 파일: $skipped개"
스크립트 실행하기
스크립트를 저장했다면 실행 권한을 주고 사용해보세요.
# 실행 권한 부여
chmod +x rename_photos.sh
# 스크립트 실행
./rename_photos.sh ~/Pictures/여행사진
주의사항과 개선 팁
GPS 정보가 없는 사진도 많아요. 특히 카카오톡이나 인스타그램으로 받은 사진들은 대부분 GPS 정보가 제거되어 있어요. 원본 사진을 사용하는 게 좋아요.
스크립트 실행 전에 반드시 백업을 해두세요. 파일명이 바뀌면 되돌리기 어려워요.
# 백업 폴더 만들기
cp -r ~/Pictures/여행사진 ~/Pictures/여행사진_백업
카카오맵 API는 한국 주소에 특화되어 있어요. 해외 사진은 구글맵 API나 OpenStreetMap을 사용하는 게 나을 수 있어요.
파일명이 너무 길어질 수 있으니 주소를 간단하게 만드는 함수를 추가할 수도 있어요.
# 주소 단순화 함수 예시
simplify_address() {
local full_address="$1"
# 시/도와 구/군만 추출
echo "$full_address" | awk '{print $1" "$2}'
}
윈도우에서 작성한 스크립트를 맥에서 실행하면 오류가 날 수 있어요. 줄바꿈 문자 때문인데요, 이럴 때는 다음 명령어로 해결해요.
# 줄바꿈 문자 변환
sed -i '' 's/\r$//' rename_photos.sh
API 호출 횟수에 제한이 있을 수 있으니 대량의 사진을 처리할 때는 sleep 명령어로 딜레이를 주는 것도 좋아요.
# API 호출 후 0.5초 대기
sleep 0.5
더 나아가서 촬영 시간 정보도 함께 활용하면 "2024-08-05_서울_남산타워.jpg" 같은 형태로 만들 수도 있어요. exiftool의 -DateTimeOriginal 옵션을 사용하면 돼요.
이렇게 하면 수천 장의 여행 사진도 깔끔하게 정리할 수 있어요. 폴더를 열었을 때 파일명만 봐도 어디서 찍은 사진인지 바로 알 수 있죠. 나중에 추억을 찾을 때도 훨씬 편리해요.