exiftool로 구글 테이크아웃 사진 날짜 고치기, 솔직한 안내
테이크아웃 .json 사이드카의 날짜와 GPS를 사진에 복사하는 exiftool 명령, 어디서 실패하는지, 언제 멈추고 GUI 도구로 넘어가야 하는지 설명합니다.
exiftool은 무료이고, 어디서나 돌아가며, 구글 테이크아웃 내보내기를 고칠 수 있습니다. 대부분의 안내 글은 명령 하나를 주고 끝냅니다. 그 명령은 사진 다섯 장 중 네 장에서 동작합니다. 이 글은 다섯 번째 장에 무슨 일이 일어나는지도 다룹니다.
설치
맥은 brew install exiftool. 데비안이나 우분투는 sudo apt install libimage-exiftool-perl. 페도라는 sudo dnf install perl-Image-ExifTool. 윈도우는 exiftool.org에서 zip을 받아 풀고 exiftool(-k).exe를 exiftool.exe로 이름을 바꿉니다. 그다음 압축을 푼 Takeout 폴더가 있는 위치에서 터미널이나 명령 프롬프트를 엽니다.
처음에는 사본으로 작업하십시오. exiftool은 파일에 직접 씁니다.
기본 명령
사진마다 옆에 사이드카가 있습니다. 2024년 이후 내보내기는 IMG_2034.JPG.supplemental-metadata.json, 그 이전은 IMG_2034.JPG.json입니다. 사이드카의 photoTakenTime.timestamp가 1970년부터 센 초 단위의 실제 촬영 시각입니다. 다음 명령이 이 값을 사진에 복사합니다.
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-CreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext jpg -ext jpeg -ext png -ext heic -ext gif \
-overwrite_original -progress "Takeout/Google Photos"
하나씩 보면 이렇습니다. -r은 하위 폴더까지 돕니다. -d %s는 읽는 날짜가 초 단위 숫자라고 알려 줍니다. -tagsfromfile은 %d(사진의 폴더)와 %F(확장자 포함 파일 이름)로 사이드카 이름을 만듭니다. <가 있는 세 줄이 타임스탬프를 EXIF 촬영일, EXIF 생성일, 파일 수정 날짜에 복사합니다. -overwrite_original은 exiftool이 파일마다 _original 사본을 남기지 않게 합니다. 윈도우 명령 프롬프트에서는 줄 끝의 \를 빼고 한 줄로 이어 쓰면 됩니다.
옛 내보내기라면 "%d/%F.json"으로 한 번 더 돌립니다. 이미 첫 실행에서 날짜를 받은 파일은 같은 값으로 다시 쓰일 뿐입니다.
GPS도 같은 실행에서 넣으려면 네 줄을 더합니다.
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
구글은 위치가 없는 사진에 0.0을 씁니다. -if '$GeoDataLatitude ne 0'으로 감싸지 않으면 사진 수백 장이 대서양 한가운데에 찍힙니다. 테이크아웃 위치 정보 복구에서 더 다룹니다.
끝나면 exiftool이 몇 개를 고쳤고 몇 개를 건너뛰었는지 출력합니다. 건너뛴 파일에서 저녁 시간이 사라집니다.
어디서 실패하나
잘린 사이드카 이름. 구글은 긴 사이드카 이름을 46자 정도에서 잘라 버립니다. PXL_20230812_193044123.RAW-01.COVER.jpg의 사이드카는 PXL_20230812_193044123.RAW-01.COVER.supplemen.json이거나 더 짧습니다. 갤럭시의 20230812_193044.jpg도 20230812_193044.jpg.supplemental-metada.json으로 잘립니다. %F 패턴은 절대 일치하지 않습니다. 남은 파일을 나열해서 손으로 또는 스크립트로 짝을 맞춰야 합니다.
(1) 중복. 같은 이름을 두 번 올렸다면 사진은 IMG_1234(1).jpg인데 사이드카는 IMG_1234.jpg(1).json입니다. 괄호가 옮겨 갔습니다. 본 명령을 돌리기 전에 사이드카 이름을 바꾸는 작업이 필요합니다.
for j in "Takeout/Google Photos"/*/*"("*").json"; do
mv "$j" "$(echo "$j" | sed -E 's/\.([a-zA-Z0-9]+)\(([0-9]+)\)(\.supplemental-metadata)?\.json$/(\2).\1\3.json/')"
done
편집된 사본. IMG_1234-edited.jpg에는 자체 사이드카가 없습니다. 원본의 것을 같이 씁니다. 원본을 먼저 끝낸 뒤 원본에서 복사합니다.
for f in "Takeout/Google Photos"/*/*-edited.*; do
exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done
동영상. MP4와 MOV는 EXIF를 쓰지 않습니다. QuickTime 컨테이너 안의 다른 태그에 날짜를 두고, 그 태그는 UTC로 읽힙니다.
exiftool -r -d %s -api QuickTimeUTC -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
"-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext mp4 -ext mov -overwrite_original "Takeout/Google Photos"
라이브 포토의 동영상 부분에는 사이드카가 아예 없어서 이 작업 뒤에도 날짜가 없습니다.
시간대 함정
사이드카 타임스탬프는 UTC 기준의 정확한 시각입니다. EXIF DateTimeOriginal은 시간대가 없는 벽시계 시각입니다. exiftool은 컴퓨터의 현재 시간대로 그 간극을 메웁니다. 서울에서 오전 11시 5분에 찍은 사진은 컴퓨터가 한국 시간이면 11시 5분, 뉴욕 시간이면 전날 밤 9시 5분으로 나옵니다.
실행 전에 사진을 주로 찍은 지역의 시간대를 지정하십시오.
TZ=Asia/Seoul exiftool ...
다른 시간대에서 찍은 여행 사진은 여전히 몇 시간 어긋납니다. 사이드카만으로는 피할 수 없고, 살아남은 카메라 EXIF만이 현지 시각의 유일한 기록입니다. 이미 좋은 EXIF 날짜가 있는 사진은 "고치지" 마십시오. -if 'not $DateTimeOriginal'을 붙이면 그런 사진은 건드리지 않습니다.
저녁 시간을 쓸 가치가 있나
카메라 사진 몇천 장뿐인 깔끔한 내보내기라면 이 글을 읽는 시간까지 포함해 한 시간이면 됩니다. 카카오톡 사진, 스크린샷, (1) 중복, HEIC, 동영상, 라이브 포토가 섞인 실제 라이브러리라면 저녁 하나를 잡고, exiftool -r -if 'not $DateTimeOriginal' -filename을 몇 번 돌려 아직 날짜 없는 파일을 확인하게 될 것입니다.
파일 이름을 날짜로 바꾸고, 연/월 폴더로 정리하고, HEIC를 JPG로 바꾸고, 라이브 포토 짝을 유지하는 것까지 원한다면 명령 네 개와 반복문을 더 이어 붙여야 합니다. 그것을 즐긴다면 괜찮습니다. GooglePhotosTakeoutHelper는 이름 문제를 대신 처리하는 무료 스크립트이고, 터미널은 편하지만 sed를 직접 쓰기는 싫은 사람에게 좋은 중간 단계입니다.
앱으로 하기
Takeout JSON Metadata Fixer는 이 목록 전체를 한 번에, 시험 실행부터 하고, 윈도우, 맥, 리눅스에서 처리합니다.
모든 사진을 사이드카와 짝짓습니다. 잘린 이름, (1) 중복, -edited 사본까지 포함합니다. 그리고 photoTakenTime과 GPS를 파일에 씁니다. 동영상은 QuickTime 태그를 받습니다. 라이브 포토의 동영상은 정지 사진의 날짜를 물려받습니다. 사이드카가 없는 사진은 EXIF 날짜를 유지하고, 둘 다 없으면 파일 날짜를 쓰기 때문에 날짜 없는 사진은 나오지 않습니다.
이름과 폴더 템플릿은 선택입니다. "이름 유지"와 "내 폴더 유지"를 고르면 날짜만 고칩니다. 시작 전에 디스크 공간을 확인하고, 완전히 오프라인으로 동작합니다. 인터페이스는 한국어입니다. 처음 1000장은 무료이고, 무제한은 19.99달러 한 번입니다. 저녁 시간 하나보다 쌉니다.
자주 묻는 질문
exiftool이 사이드카에 대해 "Warning: No writable tags set from"이라고 합니다.
사이드카는 있지만 photoTakenTime이 없거나, 이름 패턴이 엉뚱한 파일과 일치한 것입니다. .json을 열어 확인하십시오. 앨범의 metadata.json도 이 경고를 내는데 무시해도 됩니다.
압축을 풀지 않고 zip에 바로 돌릴 수 있나요?
아니요. exiftool은 디스크에 풀린 파일이 필요합니다. 먼저 모든 조각을 한 폴더에 푸십시오.
EXIF를 쓰면 사진이 바뀌나요?
아니요. exiftool은 메타데이터 블록만 다시 쓰고 이미지 데이터는 건드리지 않습니다. 파일이 몇백 바이트 커질 수는 있습니다.
photoTakenTime과 creationTime 중 어느 것을 복사하나요?
photoTakenTime입니다. creationTime은 구글에 업로드한 시각이라 몇 년 뒤일 때가 많습니다.