EXIFデータを指定して、写真の名前を変更するにはどうすればよいですか?


14

すべての写真に正しいEXIF情報が含まれていて、写真にランダムな名前が付けられているとします(問題があったため)。jhead以下の出力を提供する小さなプログラムがあります:

$ jhead IMG_9563.JPG

File name    : IMG_9563.JPG
File size    : 638908 bytes
File date    : 2011:02:03 20:25:09
Camera make  : Canon
Camera model : Canon PowerShot SX210 IS
Date/Time    : 2011:02:03 20:20:24
Resolution   : 1500 x 2000
Flash used   : Yes (manual)
Focal length :  5.0mm  (35mm equivalent: 29mm)
CCD width    : 6.17mm
Exposure time: 0.0080 s  (1/125)
Aperture     : f/3.1
Focus dist.  : 0.29m
ISO equiv.   : 125
Exposure bias: -1.67
Whitebalance : Manual
Light Source : Daylight
Metering Mode: pattern
Exposure Mode: Manual

次に、フォルダ内のすべての写真の名前を次の形式に変更する必要があります。

001.JPG
002.JPG
003.JPG
...

マイナー番号は古いイメージで、最大番号は新しいイメージです。

私はスクリプティングが苦手なので、助けを求めています。

bashスクリプトで十分だと思いますが、より快適に感じる場合は、pythonスクリプトを作成できます。

私は次のようなもので考えました:

$ mv IMG_9563.JPG `jhead IMG_9563.JPG | grep date`

しかし、私は一度にすべてのファイルに対してそれを行う方法を知りません。


マイナー/最大センテンスと前の例がわかりません。これを明確にできますか?
-maxschlepzig

そのマイナー/最大ファイル名は1つ上のステップです。なぜなら、それらが表すファイルに古いものと新しいものを表す名前を付けたら、別のプログラムで001.jpg、002.jpgなどに簡単に名前を変更できるからです。
トマス

「テーブルの名前を変更する」だろうls *.JPG | wc > rename。そして、私はXXX.JPGにスクリプトの名前変更を使用する必要があるだろう
トマス・

ソリー、そうじゃないwc、名前で注文するのを忘れた。
トマス

コマンドはソートです。
トマス

回答:


10

forループ(シェル内/シェルスクリプト内)を使用して、すべてのファイルに対して実行できます。

for i in *.JPG; do
  j=`jhead "$i" | grep date | sed 's/^File date[^:]\+: \(.\+\)$/\1/'`.jpg
  echo mv -i "$i" "$j"
done

これは非常に基本的な概要です。echoすべてが期待どおりに機能することを確認したら削除します。


ありがとう。さて、grep woudlは私に与えますFile date : 2011:02:03 20:25:09。2列目のみをフィルター処理するにはどうすればよいですか?
トマス

そのため、ファイルの名前を変更するのは20:25:09
Tomas

@Tomas、答えを更新しました-本当に時間だけが必要な場合(衝突についてはどうですか?)、もちろん正規表現を変更する必要があります。
-maxschlepzig

j=`jhead "$i" | grep date | sed 's/.* //'`.jpg代わりに?
派手な

@maxshlepzig:ありがとう、'以前の `` .jpg` を逃した
トマス

28

ここで、jheadがすべてをあなたに代わって実行できることがわかりました!:)

jhead -autorot -nf%Y-%m-%d_%H-%M-%S *.jpg

7
はい!ただし、その特定のformat-stringには注意してください。同じ秒に取得された2つのファイルに同じ名前が付けられるためです。%i(または%03i、具体的には)元の質問で要求されたシーケンス番号を提供します。両方を組み合わせることは悪い考えではないかもしれません。
mattdm

mattdmのコメントに応答するために、 '' jhead ''マニュアルでは、重複(同一のタイムスタンプ)に追加の数字または文字(1、2、3またはa、b、cなど)を自動的に追加することを提案しています。
ジョンU

0

たとえば、重要な露出値をファイル名に含めるために、誰かがより複雑な名前変更を必要とする場合、ここに私の小さなスクリプトがあります。jpegファイルの名前を次のように変更しますNightSky_2014.08.27_22.30.05_NX20_F2.8_f20.0mm_20s_ISO800.jpg

#!/bin/bash

for s in *.jpg *.JPG
do
 echo $s
 x=`jhead "$s" | \
 awk 'BEGIN { cmt=""; }
/Camera model/   { c=$4$5$6;} 
/Exposure time:/ { e=$3; 
                   if (e==int(e)) e=int(e); 
                   if (e<1) {e=int(0.5+1/e); e="1T" e "s";} else { e=e "s"; } 
                 }
/ISO equiv./     { iso="ISO" $4; } 
/Focal length/   { f="f" $4; } 
/Date.Time /     { d=$3 "_" $4; gsub(":",".",d); }
/Aperture /      { ap=$3; gsub("f/","F",ap); } 
/Comment  /      { cmt=$3 "_"; }
END { print cmt d "_" c "_" ap "_" f "_" e "_" iso ".jpg"; }'`

 echo mv $s $x
 mv $s $x
 echo =====
done

0

私はmaxschlepzigが投稿したコードが好きでしたが、それでも出力に問題がありました。

問題は、結果のファイル名のスペース(日付文字列と時刻文字列の間)でした。GUIを使用している人にとってはささいなことですが、コマンドラインでのファイル処理は多少難しくなります。

ここで、「sed」コマンドは、以前のモノリシックな議論を支持して、4つの別個の「sed」操作に大幅に変更されました。自分に合うように、以下もファイルを通常の644パーミッションに変更します。

for i in *.JPG ; do
  chmod 644 $i
  j=`jhead "$i" | grep ^Date/Time | sed -e 's/^Date\/Time[ ]\+: //;s/:/-/g;s/ /_/g':/-/g;s/ /_/g'`.jpg
  echo mv -i "$i" "$j"
  # mv -i "$i" "$j"
done

2
Stack Exchangeへようこそ。(1)私はsedかなりよく理解しているので、基本的にあなたがやろうとしていることを理解しています。しかし、Stack Exchangeでの私たちの目標は、魚のサンドイッチを配ったり、些細な質問に何千もの解決策を書いたりすることではありません。私たちの目標は、人々に釣りの方法を教えることです(つまり、現在の質問者や将来の読者を含む人々に、自分の問題を解決する方法を教える)。そのために、あなたが努力していることを説明した場合、あなたの答えはより良いでしょう。(コメントで返信しないでください。回答を編集してわかりやすくします。)…(続き)
G-Manは「Reinstate Monica」と言います

(続き)…(2)引用符のバランスが取れていないため、コマンドは失敗します。未テストのコードを投稿しないでください。
G-Manは「Reinstate Monica」と言います

0

(imho)の方が扱いやすいため、Rubyスクリプトを自分で作成しました。

require 'fileutils'

ARGV.each { |file|
  if File.exist?(file) && !File.directory?(file)
    exif = `exiftool "#{file}" | grep -E "(Error|Create Date)"`
    if exif.strip.size > 0
      exif = exif.split("\n")[0].split(/\s+/)
      if exif[0] != "Error"
        # Change the target format here
        filename = exif[3].gsub(":", "-") + " " + 
                   exif[4].gsub(":", ".") + 
                   File.extname(file)
        if filename != file && !File.exist?(filename)
          FileUtils::mv(file, File.dirname(file) + "/" + filename)
        end
      end
    end
  end
}

これは何をしますか?

  1. パラメーターとして渡されたすべてのファイルを繰り返し処理します(例:)*.JPG

    RAWファイルとビデオが正しく処理されることを確認しました。それはexiftool対処できるすべてのもので動作するはずです。

  2. ファイルの場合は何もしません

    • 存在しない、
    • ディレクトリです
    • EXIF日付がない、または
    • exiftool エラーを報告する、または
    • ターゲットファイル名のファイルは既に存在します。

それは非常に堅牢になります。特に、他のいくつかの回答の場合のように、ファイルは(黙って)消えることはありません。


0

exiv2 非常に単純な構文を許可する操作の代替手段になります。

exiv2は、Exif、IPTC、XMPメタデータ、画像コメントを読み書きするプログラムであり、多くのベンダーmakernoteタグを読み取ることができます。このプログラムは、オプションでExifタグ、XMPプロパティ、およびIPTCデータセットを変換します

そのため、現在のフォルダー内のすべてのjpegの名前が変更されます。

for i in *.JPG; do exiv2 -v -r '%Y%m%d.%H%M%S.:basename:' rename "$i"; done

地理情報も追加する場合は、次を使用できますexivtool

exiftool '-filename<${gpslatitude;} ${gpslongitude} ${datetimeoriginal}' -d "%Y-%m-%d %H.%M.%S%%-c.%%e" *.JPG

0

@Kevinのソリューションが気に入っています。元の名前も保持したい(同じ秒で撮影された画像の問題を回避する)ため、ここに私のソリューションがあります。

for i in *.JPG; do jhead -nf%Y%m%d_%H%M%S_"$(basename "$i" .JPG)" "$i" ; done

0

初心者による最初の投稿...最初のbashスクリプト...名前変更に詳細が含まれていたため、上記のLibor / HalosGhostソリューションが気に入りました。ただし、テスト後、ファイル名が重複するとファイルが失われます。そこで、簡単に参照して衝突を防ぐために、ファイル名の最後にカウンタータグを追加しました。ここの誰かがこれを改善できると確信していますが、それが役立つかもしれないと思った。

コードを投稿して申し訳ありません。私はインターフェイスに問題を抱えていますが、誰かが物事の正しい方法を教えてくれたら、それは素晴らしいことです。

#!/bin/bash

y=1
for s in *.jpg *.JPG
do
 echo $s
 x=`jhead "$s" | \
 awk 'BEGIN { cmt=""; }
/Camera model/   { c=$4$5$6;}
/Exposure time:/ { e=$3;
                   if (e==int(e)) e=int(e);
                   if (e<1) {e=int(0.5+1/e); e="1T" e "s";} else { e=e "s"; }
                 }
/ISO equiv./     { iso="ISO" $4; }
/Focal length/   { f="f" $4; }
/Date.Time /     { d=$3 "_" $4; gsub(":","",d); }
/Aperture /      { ap=$3; gsub("f/","F",ap); }
/Comment  /      { cmt=$3 "_"; }
END { print cmt d "_" c "_" ap "_" f "_" e "_" iso "_" ; }'`

 echo mv $s "$x${y}.jpg"
 mv $s "$x${y}.jpg"
 y=$((y+1))
 echo =====
done

編集してくれたスティーブンに感謝します。学ぼうと
jgroezin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.