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 データとして追加するように指示しますか?

アップデート: DD-MM-YY と 12 時間制のファイル名の解析に関する私の質問 (現在パート 1) は、@Stephane によって非常に親切に回答されました。しかし、同じ写真のバッチに、私が見逃していた 1 つのバリエーションのファイル名が含まれていることがわかりました。まったく新しい質問を開始するのではなく、「パート 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::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」、セミコロンなどで何が起こっているのか理解するのに(少なくとも私には)役に立たないようですし、グーグルで検索するのも無理です :S

答え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関数を使用してファイル名の日付を解析し、CreateDateタグ ( ) で受け入れられる形式に変換する予定です2011-04-15 21:38:00

Date::Manipは、多くの一般的な日付形式を理解します。たとえば、3-09-12 at 9:24 PM(日または月が最初になる米国の慣例か、米国以外の慣例かを伝える必要がありますが) および2010-09-15 at 18.44(:の代わりにを使用することに注意してください.) を理解します。

そこで、ファイル名からその部分を抽出し、.を に変換し:て に渡しますUnixDate

関連情報