EXIFTool을 사용하여 파일 이름에서 EXIF ​​데이터 추가

EXIFTool을 사용하여 파일 이름에서 EXIF ​​데이터 추가

다음과 같이 파일 이름에 타임스탬프가 포함된 사진 세트가 있습니다.

Photo on 3-09-12 at 9.24 PM #2.jpg

Photo on 3-09-12 at 9.24 PM #1.jpg

Photo on 3-09-12 at 8.23 PM.jpg

등.

("3-09-12"는 "2012년 9월 3일" 또는 DD-MM-YY를 의미합니다)

하지만 이 사진에는 EXIF ​​데이터가 전혀 없습니다. 더 큰 컬렉션으로 가져오기 전에 이 정보를 어떻게 exiftool사진의 파일 이름에서 EXIF ​​데이터로 새 타임스탬프에 추가하도록 파이프하고 지시할 수 있습니까?

업데이트: (현재 1부) DD-MM-YY 및 12시간 시간으로 파일 이름을 구문 분석하는 것에 대한 내 질문에 @Stephane이 매우 친절하게 답변했습니다. 그러나 동일한 사진 모음에 내가 놓친 한 가지 변형이 있는 파일 이름이 포함되어 있다는 것을 발견했습니다. 'Pt.'를 추가하는 것이 더 의미가 있기를 바랍니다. 2' 완전히 새로운 질문을 시작하는 대신.

요컨대:

@Stephane의 훌륭한 답변을 어떻게 바꿀 수 있습니까?

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*?at.*?[AP]M)/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*[PA]M*.jpg

-- YYYY-MM-DD 및 24시간제를 사용한다는 점에서 질문의 첫 번째 부분과 약간 다른 아래 파일 이름 형식으로 작동할 수 있습니다.

Photo on 2010-09-15 at 18.44 #4.jpg

Photo on 2010-09-15 at 18.44 #3.jpg

Photo on 2010-09-15 at 18.44.jpg

추가 설명:

Stephane의 스크립트 일부 를 편집하려고 하면 Date::Manip스크립트의 가장 중요한 부분에서 무슨 일이 일어나고 있는지에 대한 나의 무지가 드러나는 것 같습니다.

Date_InitISO와 같은 전체 연도 날짜 형식으로 돌아가서 다음 줄을 생략하려고 했습니다 .

/on (.*?at.*?)/;$_=$1;
y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
' ./*on\ *at*.jpg

하지만 exiftool나에게 no writeable tagsFileName not defined. 지침:http://search.cpan.org/~sbeck/Date-Manip-5.56/lib/Date/Manip.pod해당 마침표에 무슨 일이 일어나고 있는지 이해하는 데 (적어도 나에게는) 도움이 되지 않는 것 같습니다. 줄 시작 부분의 'y', 세미콜론 등은 Google 검색이 불가능합니다.

답변1

노력하다:

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*at.*?)(?: #\d+)?\.jpg$/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*.jpg

(모듈을 설치해야 할 수도 있습니다 Date::Manip perl).

-Tag<value해당 태그를 설정합니다 . 는 에서 처리된 후 ${tag;perl-code}의 값으로 확장하는 데 사용할 수 있습니다 .tagperl-code

Date::Manip여기서는 의 기능을 사용하여 파일 이름의 날짜를 구문 분석하고 태그( ) UnixDate에 허용되는 형식으로 변환할 계획입니다 .CreateDate2011-04-15 21:38:00

Date::Manip많은 일반적인 날짜 형식을 이해합니다. 예를 들어, 3-09-12 at 9:24 PM일이나 월이 먼저 나오는 미국식인지 비미국식인지 알려주어야 하지만) 및 2010-09-15 at 18.44( :대신에 를 참고하세요 .)를 이해합니다.

그래서 우리가 하는 일은 파일 이름에서 해당 부분을 추출하고 를 .로 변환 :한 다음 에 전달하는 것입니다 UnixDate.

관련 정보