본문 바로가기

일::개발

사진 파일의 exif, modification date 정리하기

exif 에 저장되어 있는 시간과 파일명에 있는 시간과, 파일 자체의 creation, modification date가 모두 동일하면 참으로 행복하겠지만, 여러 가지 경우에 이 정보들이 달라지곤 한다.

  • 시스템 간 파일 복사 시 복사된 시간으로 creation, modification date 변경될 수 있음
  • 필터 적용 등 사진 수정 시 수정된 시간으로 modification date 변경될 수 있음
  • 필터 적용, crop 등 사진 수정 시 exif 데이터 삭제될 수 있음
  • 특정 사진 앱으로 촬영한 경우 아예 exif date 생성되지 않는 경우 있음
  • 해외에서 촬영한 경우 timezone 정보 반영되지 않는 경우 있음. 핸드폰으로 촬영하는 경우 exif 데이터는 현지 시간으로 반영되지만, 파일명이나 파일 생성 시간은 KST 기준으로 저장되는 경우 있음
  • 시간 정보가 설정되지 않거나 잘못 설정된 기기(DSLR 등)로 촬영한 경우 모든 정보가 잘못 들어갈 수 있음

이런 여러가지 원인으로 사진의 시간 정보가 제대로 들어가지 않는 경우 사진을 정리하고 찾는데 큰 문제가 생긴다.

대부분의 사진 서비스나 스마트폰 갤러리 앱이 file modification date 기준으로 사진을 정렬하여 보여주기 때문에 특히 file modification date를 잘 관리하는 것이 중요하다.

 

케이스별로 해결법을 정리해둔다. mac os 에서 작업하는 것을 기준으로 하고, 시간 정보가 다른 경우 exif, filename, file modification date 순으로 신뢰도를 가지고 정리한다. 정보가 존재하는 경우 틀릴 확률이 낮은 순이다.

 

1. exif 정보가 존재하는 경우

특별히 존재하는 exif 정보를 믿지 못할 이유가 없다면, exif에서 사진 생성일을 추출하여 modification date를 수정해준다. 

여러 툴이 존재하지만, 많은 파일을 일괄 처리하기에 jhead(https://www.sentex.ca/~mwandel/jhead/)가 가장 간편했다. mac, windows 모두 사용 가능

 

사용법도 간단하다.

> jhead -ft *.jpg

모든 jpg 파일의 exif 정보에서 사진 생성일을 추출하여 modification date를 변경해준다.

 

2. exif 정보가 존재하지 않고, 파일명에서 사진 생성일을 유추해야 하는 경우

필터 앱으로 촬영한 사진이 이런 경우가 많다.

exif 정보를 아예 생성하지 않는데, 다행히 파일명에 생성일 정보가 들어있는 경우다. 

하나의 파일만 변경할 때는 touch를 이용한다.

> touch -mt 202111092131.23 2021_11_09_21_31_23.jpg

지정할 시간이 YYYYMMDDhhmm.ss (초는 . 이후에 나와야 한다) 인 것만 주의하면 아주 간단하다.

-mt 옵션은 file modification date 만 변경한다.

 

여러 파일을 처리해야 할 때는 다음과 같이 해준다.

> find . -name "BeautyPlus_20*" -exec bash -c 'for f; do t=${f##*/};  touch -mt ${t:11:12}.${t:23:2} ${f}; done' sh {} \+

find . -name "BeautyPlus_20*" 으로 "BeautyPlua_20" 으로 시작하는 모든 파일을 검색한 후에 검색된 파일에 대해서 아래의 loop 를 돌려준다.

for f;

  do t=${f##*/};

  touch -mt ${t:17:12}.${t:29:2} ${f}; 

done

 

do t=${f##*/} 부분은 파일명 중에 디렉토리 명을 제외하기 위함이다. (${f##something} 은 $f 중에서 something으로 매칭되는 가장 긴 부분을 제외함. https://tldp.org/LDP/abs/html/string-manipulation.html 참고)