Scripting

使用 EXIFTool 從文件名中添加 EXIF 數據

  • July 9, 2014

有一組照片的文件名中帶有時間戳,如下所示:

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 數據,所有這些都來自照片的文件名?

更新:@Stephane 非常友好地回答了我關於使用 DD-MM-YY 和 12 小時時間解析文件名的問題(現在的第 1 部分)。但我發現同一批照片包含的文件名有一個我錯過的變體。我希望添加一個“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

更多解釋:

嘗試編輯Date::ManipStephane 腳本的一部分似乎表明我對其中最重要部分發生的事情一無所知。

我嘗試省略該Date_Init行,因為我們回到了 ISO 風格的全年日期格式,然後有了

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

而是exiftool給我no writeable tagsFileName not definedhttp://search.cpan.org/~sbeck/Date-Manip-5.56/lib/Date/Manip.pod上的說明似乎對理解這些時期的情況沒有幫助(至少對我而言),行首的’y’,分號等,而且它們相當難以搜尋:S

嘗試:

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}可用於擴展為 的值。tag``perl-code

在這裡,計劃是使用Date::ManipUnixDate函式來解析文件名中的日期,並將其轉換為CreateDate標籤 ( 2011-04-15 21:38:00) 可接受的格式。

Date::Manip了解很多常見的日期格式。例如,它理解3-09-12 at 9:24 PM(儘管您必須告訴它是美國還是非美國慣例,日期或月份在前)和2010-09-15 at 18.44(注意:代替.)。

所以我們要做的是從文件名中提取該部分,將其轉換.:並將其傳遞給UnixDate.

引用自:https://unix.stackexchange.com/questions/128452