次のようなファイル名にタイムスタンプが付いた写真のセットがあります。
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_Init
ISO風の年単位の日付形式に戻ったので、行 を省略して、
/on (.*?at.*?)/;$_=$1;
y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
' ./*on\ *at*.jpg
しかし、exiftool
私に与えていますno writeable tags
。FileName 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}
の値に展開するために使用できます。tag
perl-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
。