画像の名前をexif時間に変更:固有のファイル名を作成


11

exivで画像の名前をexif日時に変更した場合、次のようにします。

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

これで、写真のタイムスタンプがまったく同じになる場合があります(秒を含む)。ファイル名を自動的に一意にするにはどうすればよいですか?

同じディレクトリ構造で再度実行した場合(おそらく新しい画像を追加した後)、既に名前が変更された画像は変更されず、既存のファイル名を持つ画像が追加された場合、新しいファイル名は一意になるという意味で、コマンドは安定している必要があります。同様に。

私の最初の試みは、結果のファイル名に元のベース名を残すことだけでしたが、その場合、コマンドは上記の意味で安定しません。


1
タイムスタンプを抽出し、ファイル名を作成し、既存のファイル名を確認し、存在する場合はファイルを変更(サフィックスなどを追加)mvします。
クサラナンダ

exiv2コマンドにオプションを追加するより直接的な方法もありますか?
学生

したがって、exiftoolを使用した答えは次のようになりますexiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .。多分あなたはあなたのコメントを答えに変えることができます。
学生

回答:


17

あなたは試してみたいことがありますjhead(とそのアウトオブボックスをしている代わりにab... z同じ日に27個のファイルまで可能接尾辞)と安定性の問題が@meuhで言及されていません。

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

またはexiftool(manページの例)を使用します。

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(ここで%-cは、で始まる数値のサフィックスを使用しています-


3

exiv2(0.25 001900)の私のバージョンは、ファイル名が既に存在する場合、何をするかを対話的に尋ねます。

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

オプションを追加する-Fことにより、代わりに自動的に名前に追加_1_2など)が追加されます。

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

コマンドをもう一度実行すると、次のようになります。

This file already has the correct name

何もしませんが、_1パーツがあると混乱し、名前を変更し_2ます。実行ごとに、非破壊的な方法でこのように切り替わります。必要に応じてこれを無視するか、findパターンを変更して、日付パターンと_一部が一致するファイルを無視することができます。

たとえば、日付形式の正規表現パターンが始まります[0-9]{4}_[0-9]{2}_...。簡単にするために、セット0..9とからの20文字の組み合わせを探します。_これはregex [0-9_]{20}です。これには、接尾辞の_後に検索する少なくとも1桁が続き_[0-9]{1,}.jpgます。正規表現はベース名だけでなくパス全体と一致する必要があるため、ディレクトリを含む最終的な正規表現は.*/[0-9_]{20}_[0-9]{1,}.jpgです。

したがって、次のような検索を使用できます。

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...

1

Exiv2はそれ自体で処理できます。また、私はexiv2のマニュアルを見に行くまで、これについてのヘルプを探すのに多くの時間を費やしました。-Fオプションはこの問題を解決します。

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

ファイルが既に存在する場合は、末尾に_Nが追加されます。

そして、フォルダの作成を許可するオプションを探している人のために。

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

0

ピレナマーは新しくインストールしたUbuntu 16.04では機能しないため、この問題を解決する別の方法を見つける必要があります。

1つのフォルダーにIMG_0001.JPG、IMG_0002.JPGなどのファイルがあります。このサイトを確認してください、 https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

最初に「exiv2」をインストールし、次のコマンドラインを作成しました。

$(ls *。[Jj] [Pp] [Gg] 2> / dev / null);のimgの場合 do exiv2 -r '%Y%m%d_%H%M%S _' "$(tmp = $ {img %%。*}; echo $ {tmp ## * _})" rename "$ img"; 終わった

出力ファイル名はYYYYMMDD_HHMMSS_0001.JPG、YYYYMMDD_HHMMSS_0002.JPGなどです。同じ秒で撮影された写真でも、元の写真のシリアル番号が違います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.