EXIFデータに基づいて複数の写真やビデオの名前を変更する方法は?


11

私はよくデジタルカメラやタブレットからPCに写真とビデオ(ほとんどがJPGとMOVの拡張子を持つ)をインポートしますが、EXIFデータに既に存在する撮影日時に従って並べ替えて表示したいのですが。したがって、すべてのファイル名の前に日付とタイムスタンプを挿入することにより、できれば単純なNautilusスクリプトを使用して、すべてのファイル名を変更したいのです。

これまでのところ、次のNautilusスクリプトをまとめることしかできませんでした。

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

この名前変更方法で私が気に入らないのは、EXIFの日付とタイムスタンプで使用されるコロン(例: "2013:09:03 20:55:09_IMG_0108.JPG")で、これらのファイルを後で他の環境に転送するときに問題が発生する可能性があります(例:Windows)。

このコマンド(exiftoolの代わりにexiv2を使用)は、日付と時刻のスタンプの操作を簡単に有効にしますが、その欠点は、ビデオ(MOVなど)ファイルは機能しないことです

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

だから私は誰かがより良い解決策を考え出せることを望んでいます。そして、元のファイル名と拡張子を小文字に変換することさえできたなら、それは魔法です!


以下のすばらしい答えに加えて、pyRenamerもチェックしてください。ビデオファイルでの使用経験はありませんが(EXIFデータはありますか?)、写真には最適です。ファイル拡張子を小文字に変更することもできます。
トムBrossman 2013年

回答:


6

この名前変更方法で私が気に入らないのは、EXIFの日付とタイムスタンプで使用されるコロン(例: "2013:09:03 20:55:09_IMG_0108.JPG")で、これらのファイルを後で他の環境に転送するときに問題が発生する可能性があります(例:Windows)。

次のように、名前付けスキーマをsedで実行して、コロンをダッシュ​​に、スペースをアンダースコアに置き換えることができます。

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

全体を小文字にする場合は、次のように使用できますrename

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

またはsed、次のようにを使用してスクリプト内で実行することもできます。

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

...そして、$j変数を行の最終$iの代わりに使用しますmv。sedは普遍的ですが、Linuxディストリビューションごとに名前変更コマンドが異なるため、このsedの方法は少し移植性があります(重要な場合)。

または、代わりに、スクリプトを次のように変更して、tr代わりに使用してファイル名を小文字に変換することもできます。

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

異なるファイルタイプに対してわずかに異なるコマンドを実行するには、このスクリプトでbash caseステートメントを使用できます。例えば:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

この例では、別の(-tur)EXIFデータを使用し、その時間差サフィックスを削除することで、CreateDateタイムスタンプがANY NUMBER時間後またはBEFORE JPGファイルであるMOVファイルの名前変更が調整され、-tur部分の変更が必要になる場合があります。システムで設定された場所に従って。


残念ながら私はあなたが示唆するようにファイル名を小文字に変換する方法を理解できませんでした(その行を上に挿入して最後$iをに変更$jしても何も起こりませんでした)。代わりに、最初に小文字へのファイル名変換を挿入し、これを別のオプションとして(少なくとも私にとってはうまくいきました)自由にあなたの回答の最後に追加して、私があなたの回答を受け入れることができるようにしました。もちろん、必要に応じて回答をさらに編集できます。
サディ2013

@sadiが新鮮な目でそれを見て、私がsedコマンドで間違っていたことを確認できます。もちろん、最新バージョンは機能しますが、trメソッドが機能する場合は問題ありません(sedの方が英語以外の文字をより適切に処理できますが、trソリューションの方が実際には少し効率的かもしれないと
思い

ありがとうございました。行に沿ってMOVファイルに1つのコマンドを使用し、他のコマンドに別のコマンドを使用することで、このスクリプトをさらに改善するのに役立つかどうか疑問に思います。他の何とか何とか何とか。その理由は、MOVファイル(iPadから)の "CreateDate"スタンプが奇妙に+4時間あり、写真とビデオの正確な順序を実現するために別のオプション(CreateDate-tur)を使用する必要があることを認識したためです。 。
サディ2013

(私の意見では)そのための最良の方法は、ケースステートメントを使用することです。ここから始めましょう。ifステートメントを使用することもできますが、caseステートメントはより簡単に拡張して、追加のファイル拡張子を付けることができます。詳細については、インターネットで「bashケースステートメント」を検索してください。
evilsoup 2013

どうもありがとう!!!よろしければ、このオプションも回答に追加します。
サディ2013

13

私は自分の写真の名前を変更する必要があり、この質問をここで見つけました-私exiftoolはそれをネイティブで処理することがわかりました:

http://www.sno.phy.queensu.ca/~phil/exiftool/filename.htmlから

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

元のファイル名を追跡し、拡張子を小文字にしたい場合:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

小文字のファイル名全体でも同様に機能します。

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]

DIRは、写真が割り当てられているフォルダである必要があります。コマンドを実行するフォルダでターミナルをすでに開いている場合は、のDIRを置き換える必要があります。プレフィックスを追加する場合は、ファイル名(つまりIMG_)に引用符なしで日付チェーンの前に挿入する必要があります。ここに例:exiftool -d IMG_%Y%m%d_%H%M%S %%-c。%% e "-filename <CreateDate"。
Nothor


1

krenameこれに使用します。それ

  • ライブプレビューを表示します
  • 元に戻すことができます
  • ディレクトリに再帰的に入ることができます
  • 複数の名前変更パターンを許可
  • パターンでグロブと正規表現を許可する
  • 歴史を覚えている

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.