web-dev-qa-db-ja.com

exiftoolで名前を変更する:欠落しているタグを処理する方法は?

いくつかの異なるカメラとカムコーダーを使用してキャプチャされた、整理されていない大きなメディアファイルのグループを扱っています。bashスクリプトでexiftoolを使用して、各ファイルの名前を作成日時、メーカー、モデルに変更したいと思います。

このコマンドを使用すると、画像の名前が必要に応じて変更されます。

exiftool -m -P '-filename<${DateTimeOriginal}_${Make}_${Model}.%e' myfile.jpg

-d FMTオプションを使用して日付と時刻をフォーマットできることはすでに知っていますが、わかりやすくするために省略しています。

代わりに、DSLR「*。mov」ビデオで直面している問題は次のとおりです。

  1. exiftoolは、ファイル名モデルで「。%e」の代わりに「.mov」を使用している場合でも、.mov拡張子を削除しています
  2. これらのファイルにはDateTimeOriginalタグがなく、他のファイルにはないMediaCreateDateタグを使用する必要があります

Exiftoolに元の.mov拡張子を使用するように「強制」する方法を知っている人はいますか?

Exifタグが存在するかどうかを確認するようにexiftoolに指示する方法はありますか?最初のタグがない場合は、別のタグを使用しますか?

私は次のようなもので試しました

if [ -n `exiftool -m -p '$DateTime' filename]
then
...

しかし、exiftoolがエラーをドロップしているため、空の文字列チェックは常に失敗します。ヒントはありますか?

7
gerlos

Exiftoolの開発者であるPhilHarveyからのフィードバックのおかげで、exiftool9.30で動作する私の問題に対する本当に簡単な解決策を見つけました。

フィルはここで言います( http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5079.msg24483.html#msg2448 ):

最後の有効な割り当てが他の割り当てに優先します。

したがって、1つのコマンドですべてを実行できます。最終的なコードは次のとおりです。

#!/bin/bash
exiftool -P -d '%Y-%m-%d %H.%M.%S' \
    '-filename<${CreateDate}_${Model;}.%e' \
    '-filename<${DateTimeOriginal}_${Make;}.%e' \
    '-filename<${DateTimeOriginal}_${Make;}_${Model;}.%e' \
    $@

セミコロンは、上記の拡張機能の欠落の問題に対処するための回避策です(実際には、Modelタグの末尾のnullが原因でした)。

このアプローチの良い点の1つは、-mオプションを使用していないことです。そのため、たとえば、ほとんどのビデオのように、exifタグを持たない* .movファイルを台無しにすることはありません。ネットからダウンロードできます(無視されます)。

7
gerlos

私の知る限り、exiftoolは.mov形式の記述をサポートしていません。名前を変更しただけでも、その拡張子のファイルを作成したくない理由を説明している可能性があります。

代替タグの1つが空の場合、それらを覗くためのロジックが必要なため、exiftoolを使用して必要な情報を抽出することをお勧めします。次に、ファイルの名前を自分で変更します。これは、アイデアを開始するためのbashスクリプトです。そのままでは機能しません。それがどのように行われるかを見るためだけにあります:)

#!/bin/bash
# Scan the files you need
for i in *jpg *mov; do

    # Get the extension of the previous file
    extension=${i##*.}

    # Extract metadata from the file
    model=$( exiftool -f -s3 -"Model" "${i}" )
    make=$( exiftool -f -s3 -"Make" "${i}" )
    datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" )

    # If the datetime value is empty (returned '-' because of the '-f' option)
    # then read another tag
    if [ "${datetime}" = '-' ]; then
        datetime=$( exiftool -f -s3 -"MediaCreateDate" "${i}" )
    fi

    # Construct the new filename from the metadata gathered above
    newfilename="${datetime}-${make}-${model}.${extension}"

    # Check if the destination filename already exists, and if not,
    # create the file
    if [ ! -e "${newfilename}" ]; then
        echo mv "${i}" "${newfilename}"
    else
        echo "${i} would get renamed to ${newfilename} but that file already exists."
    fi
done
1