icloud 요금제를 사용중인데 200GB용량이 거의 꽉 차려고해서 아이폰과 icloud에 저장된 사진을 네이버 마이박스나 구글 포토에 백업하기로 했다.
또, 오래전 쓰던 첫 구글 계정에 백업해둔 옛날 사진들은 외장하드로 옮기기로 했다.
그런데 사진을 옮겨다닐때마다 사진 찍은 날짜가 아닌 생성일, 수정일이 바뀌는 것이 싫었다. 윈도우에서는 비교적 문제가 없다는데.. 나는 맥을 사용하니까.. 하지만 확인해보니 어느곳에 저장했던 사진 정보는 EXIF 데이터에 저장되어 계속 유지되고 있음을 알수 있었다.
구글포토 백업: gpth
구글 포토에서 직접 다운로드 할 수도 있겠지만, 구글 테이크아웃로그인 - Google 계정을 이용해서 모든 파일을 일괄적으로 export할 수 있다. 이 때, json 파일이 함께 저장되는데, 이 파일에는 사진촬영일과 위치정보, (구글포토에 추가된) 생성일이 함께 담긴다. 다만 takeout 이용시 오류가 잦다고 하는데, 나의 경우에는 비교적 최신 년도의 사진은 exif데이터가 보존되었지만, 어떤 경우에는 구글 포토에서 해당 정보를 확인 가능함에도 다운로드시 유지되지 않았다. 그래서 takeout으로 파일을 받는경우 모든 파일이 제대로 export된건지 개수 확인, exif 데이터 확인 등 이 필요할 듯 하다.
그래서 만약 json으로 분리된 정보를 exif데이터로 적용이 필요하거나 구글 포토에 저장된것을 기준으로 생성일, 수정일을 맞추고 싶다면, GitHub - TheLastGimbus/GooglePhotosTakeoutHelper: Script that organizes the Google Takeout archive into one big chronological folder을 이용한다.
./gpth-macos
폴더 선택시
Takeout
폴더를 선택해주어야하고, json파일을 기준으로 년도별/월별 폴더로 사진들을 분류할수도 있다. 테스트해보니 라이브 포토는 data-unkown폴더에 MP4영상으로 저장되고 사진도 각 폴더에 저장되었다.
사용시 외장하드보다는 맥에서 하는것이 속도가 빠르고, 오류가 없다. 외장하드에서 했을때, 날짜 입력이 안된 사진이 있었다. 알아야할 점은, 보관파일이나 사진앨범 등의 폴더에는 적용이되지않고, Photos From {년도}
폴더에 있는 파일들만 처리되어 ALL_PHOTOS 폴더에 저장된다.Takeout 폴더 여러개 처리
보관상의 이유로 여러 압축파일에 나눠 저장되어있는 경우 Takeout폴더가 여러개인데 한번에 처리하기 위해 gpth.sh스크립트를 작성해 이용했다.Takeout 1부터 20까지 적용하려면
./gpth.sh 1 20
gpth.sh
#!/bin/zsh # Check if both arguments are provided if [ -z "$1" ] || [ -z "$2" ]; then echo "Usage: $0 <start_number> <end_number>" exit 1 fi # Assign arguments to variables start=$1 end=$2 if ! [[ $start =~ ^[0-9]+$ ]] || ! [[ $end =~ ^[0-9]+$ ]]; then echo "오류: 시작번호와 끝번호는 반드시 정수여야 합니다." exit 1 fi # Iterate through the range for i in $(seq $start $end); do # Construct the input and output paths input_path=Takeout\ $i output_path=Takeout\ $i # Run the gpth-macos command ./gpth-macos --input "$input_path" --output "$output_path" --albums nothing --no-guess-from-name echo $input_path; # Check if the command succeeded if [ $? -eq 0 ]; then echo "Processed Takeout $i successfully." else echo "Error processing Takeout $i." fi done
EXIF데이터로 파일명 정렬하기: exifrenamer
편의상 EXIF에 저장된 촬영일로 정렬하여 보기를 원했다. 일단 컬럼 뷰에서는 미리보기 옵션 설정을 통해 사진촬영일을 확인할 수 있는데 (Fetching Title#h4e4 참고) 리스트뷰에서 촬영일(콘텐츠생성일, Content created) 기준으로 정렬을 원했기에 원하는 답은 아니었다. 그리고 영상의 경우 콘텐츠 생성일을 확인 할수 없었다.
exiftool이라는 것이 있었지만 처음엔 좀 더 간단하게 사용할 수 있는 것을 원했고, exif 날짜를 기준으로 파일명을 변경하는 exifrenamer를 사용하기로 했다. 파일명을 아예 exif날짜로 변경하면 또 다시 파일을 이동시킬때 생성일, 수정일이 바뀌는 일이 없으니.
qdev.de - ExifRenamer에서 다운로드하거나 brew를 통해 다운로드 한다.
brew install exifrenamer
Preferences에서 원하는 파일명 형식을 선택하고, 시간단위가 같아 파일명이 같아질 경우를 대비해 counter필드를 subfix로 추가하였다.
메타데이터 확인: ffmpeg와 exifttool
먼저 처리한 data-unkown에 저장된 라이브 포토 동영상 파일은 finder에서 촬영일을 확인할수 없어 불확실하고 생성일,수정일 반영도 되지 않은듯 했지만 exifrenamer를 이용했을때 파일명은 제대로 처리되는 경우도 드물게 있었다.
그러나 rename이 제대로 처리되지 않은 이미지와 동영상의 경우 오히려 생성일(created)은 구글포토 업로드시를 기준으로 되어있는 경우가 있었다.
exiftool을 이용해 메타데이터 확인:
brew install exiftool
exiftool 20161225_18-23-28.mp4
동영상의 경우
ffmpeg -i [파일경로]
명령어를 통해서도 확인할 수 있는데, 해당 동영상의 메타데이터를 확인하여 제목에 날짜가 반영된 파일은 creation_time
정보가 있다는걸 확인했다. exiftool에서는 CreationDate
로 확인되었다. 그러나 추후 확인한 결과에 따르면 CreateDate를 사용하는 것이 더 합리적이었다.메타데이터 수정: exiftool
MediaCreateDate 생성
앞으로 메타데이터를 기준으로 파일 관리를 할것이기 때문에 created 날짜가 상대적으로 실제 날짜에 가까웠던 mp4 파일은 exiftool을 이용한 아래 스크립트로 MediaCreateDate 메타데이터에 반영하였다.
created_to_media_create_date.sh
#!/bin/zsh # 동영상 파일 경로 VIDEO_FILE="$1" # 파일의 시스템 'created' 날짜를 가져옴 Created=$(stat -f "%SB" -t "%Y-%m-%d %H:%M:%S" "$VIDEO_FILE") # 'created' 날짜를 ExifTool에 사용할 형식으로 변환 (예: 2021:09:22 09:41:24) MediaCreateDate_format=$(echo "$Created" | sed 's/ /:/g' | sed 's/ / /') # ExifTool을 사용하여 메타데이터를 수정 exiftool -MediaCreateDate="$MediaCreateDate_format" -overwrite_original "$VIDEO_FILE" # 결과 확인 (선택 사항) echo "Updated MediaCreatedDate to: $MediaCreateDate_format" exiftool "$VIDEO_FILE" | grep MediaCreateDate
아래처럼 직접 입력해도됨
exiftool -MediaCreateDate="2018:12:08 04:17:36" -overwrite_original "20400206_15-28-16_002.mp4"
MediaCreateDate에 반영된 동영상 파일은 renamer에서 동작하였고, 사진 파일의 경우 CreateDate기준으로 renamer가 동작하였다.
DateTimeOriginal 생성
CreationDate 메타데이터가 있는 파일들을 날짜 메타데이터로 가장 많이 사용되는 듯한 DateTimeOriginal에 이를 반영했다.
exiftool -if 'not $DateTimeOriginal' -overwrite_original '-DateTimeOriginal<QuickTime:CreationDate' -r -ext mp4 20181208_04-17-36.mp4
CreateDate(or QuickTime:CreateDate)가 있어야 exifrenamer로 파일명에 반영됨을 확인하였다.
파일명의 timezone은 시스템 기준인 한국시간으로 표기된듯하다(+9는 생략되기도 했다)
참고:CreationDate가 있는 경우
태그 추가시 유의할점
exiftool -s -G [파일명]
로 확인해 봤을때 exiftool로 추가한 CreationDate의 태그는 [QuickTime]이 아닌 [XMP]
로 지정되었다. 그러나 일반적으로 QuickTime:CreationDate이다.파일명 변경 스크립트
처음에 확인한 CreationDate가 있는 파일은 exifrenamer에서 반영되지 않았기 때문에 CreationDate를 기준으로 mp4파일을 rename하도록 아래 스크립트를 작성했다
exifrename_mp4_creationdate.sh
#!/bin/zsh # 디렉토리 내 모든 mp4 파일에 대해 처리 for file in *.mp4; do # CreationDate를 추출하고 날짜 형식에 맞게 변환 creation_date=$(exiftool -CreationDate -d "%Y%m%d_%H-%M-%S" "$file" | awk -F': ' '{print $2}') # CreationDate가 없으면 건너뛰기 if [ -z "$creation_date" ]; then echo "No CreationDate found for $file, skipping." continue fi # 파일 확장자 추출 extension="${file##*.}" # 파일 이름에서 확장자를 제외한 부분만 추출 # base_name="${file%.*}" # 파일 이름을 새로 만들기 new_name="${creation_date}.$extension" # 파일이 이미 존재하는지 확인 count=1 while [ -e "$new_name" ]; do # 파일이 이미 존재하면 숫자를 증가시키면서 새로운 이름을 생성 new_name="${creation_date}_$(printf "%03d" $count).$extension" count=$((count + 1)) done # 파일 이름 변경 mv "$file" "$new_name" echo "Renamed $file to $new_name" done
결론
결과적으로 영상의 날짜 메타데이터를 관리할때는 다음과 같이 적용하는것이 범용적으로 최선인 것 같다.
이미지는 CreateDate, FileModifyDate, DateTimeOriginal 세곳에 서로 반영하고 +9로 표기
mp4영상은 MediaCreateDate을 FileModifyDate, DateTimeOriginal에.
구글포토에 적용되는 기준이라고하나 확인해본것은 아님
아래 블로그들을 참고하면 좋을 것 같다.
구글 포토 백업시 사진 메타데이터 exiftool 사용하여 복구 :: 꿈/희망/절망
[EXIF Tag] 구글 포토에서 인식 가능하도록 날짜 정보 갱신하기 :: 크롬망간이 글 쓰는 공간
또한, 사진을 네이버 마이박스에 저장할까도 싶었지만 구글포토에 업로드 하는것이 아무래도 아이클라우드에서 연동하기가 쉽고, 라이브포토가 영상으로도 저장이 되고, 오픈소스가 있으니 파일 정리하기도 쉬워서 예전 처럼 유지하는게 나을 것 같다는 결론을 내렸다.