ExifToolのかんたんなメモ

exiftoolwebart

写真や画像、メディアのメタデータに関する最強ツール、Exiftool についての若干のメモ。基本とオプションと使い方。

ExifTool

Exiftool をときどき使ってきましたが、最近特に使用頻度が上がったので使い方のメモを残しておこうと思いました。でも多分、ここのメモなんかより検索したほうが役に立つ良い記事を発見できると思います。

自分のためになることは人様のためになるかもしれない。人様のためになることは自分のためにもなりましょう。何を言ってるんだか。

ExifTool とは

写真や画像やメディアファイルからメタデータを取得したり追加したり変更したりできるツールです。メディアカタログのアプリケーションにも多く組み込まれています。コマンドラインで利用します。

ExifTool by Phil Harvey

公式サイトはこちら。https://exiftool.org

※ 本家が落ちてるときのミラー  http://exiftool.sourceforge.net

インストール

インストーラーが用意されていて、ダウンロードリンクはトップの判りやすい場所にあります。

インストーラーが用意されているってことは、ダウンロードしてダブルクリックして進めていくだけでインストールできます。

コマンドラインのツールなのにインストーラーを用意してくださるとは何とありがたいことでしょう。普通この手のツールって素人にはインストールすることもできない高難易度で出来てますからね。

マニュアル

マニュアルのURLはこちら https://exiftool.org/exiftool_pod.html
※あるいは http://exiftool.sourceforge.net/exiftool_pod.html

ちょい難しいけどいろいろ書いてあります。

基本コマンドとオプション

ターミナルを起動してタタタっと入力して使います。

コマンドと指定パスを書くのが基本の形、コマンドとパスの間にオプションを追加して ExifTool の機能を堪能できます。どんな目的でどんなオプションを使うのか、いくつかの例をあげてみます。

メタデータが欲しい

最も基本的な使い方は、コマンド ‘Exiftool’ と指定のパスだけを書いてリターンします。

exiftool パス

パスを書くのが面倒なら目的のファイルやフォルダをターミナルのウインドウにドラッグすればいいです。ファイルを指定するとそのファイルのメタデータを、フォルダを指定するとそのフォルダ内のファイルすべてのメタデータをだーっと表示してくれます。

結果はこんな感じで網羅されます。

ExifTool Version Number : 12.27
File Name : IMGP4563.jpg
File Size : 2.8 MiB
File Modification Date/Time : 2021:01:20 15:25:19+09:00
File Access Date/Time : 2021:05:19 11:56:52+09:00
File Inode Change Date/Time : 2021:04:07 10:17:01+09:00
File Permissions : -rw-r–r–
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Exif Byte Order : Big-endian (Motorola, MM)

ターミナルでは「exiftool パス」でOKですが、do shell script や Automator のシェルでは Exoftool がインストールされたパスと一緒に書く必要があります。インストーラーで普通にインストールしたらMacだとこの場所になると思います。

/usr/local/bin/exiftool パス

 

さて実際の利用では、コマンド exiftool とパスの間にオプションを付けて細かく指令することが多くなります。さまざまな機能がオプションとして用意されています。

短いタグ名

-s をくっつけます。

exiftool -s パス

-s を付けると短いタグ名で出力されます。短いというのはスペースなしのタグ名です。例えば -s なしだと「File Name」-s だと「FileName」です。

短いタグ名は、次の「タグ名を指定する」に使います。というかオプションで命じるときはすべて短いタグ名を使います。短いタグ名がほんとのタグ名、長いタグ名は表示用ラベルと思っておきましょう。

ExifToolVersion : 12.27
FileName : IMGP4402-V2.jpg
FileSize : 2.8 MiB
FileModifyDate : 2021:06:19 13:18:09+09:00
FileAccessDate : 2021:06:21 19:25:19+09:00
FileInodeChangeDate : 2021:06:19 13:18:09+09:00
FilePermissions : -rw-r–r–
FileType : JPEG
FileTypeExtension : jpg
MIMEType : image/jpeg
ExifByteOrder : Big-endian (Motorola, MM)
XResolution : 72
YResolution : 72
ResolutionUnit : inches
Artist : HOSOI Hisato
YCbCrPositioning : Centered

指定したタグだけ欲しい

特定タグの情報だけ欲しい場合はタグ名を指定します。スペースのない短いタグ名を使います。そのタグだけを取得します。

exiftool -タグ名 -タグ名 パス

こんなふうに、-タグ名 を個別に書きます。例えば exiftool -s -filename -filesize パス でファイル名とサイズを取得します。-タグ名はスペースで区切っていくらでも書き連ねられます。

値だけ欲しい -T または -b

ExifToolの出力結果は「タグ名 : 値」という形です。値だけが欲しいときがありますよね。 -T オプションを付けます。

exiftool -T -タグ名 パス

これで値だけが取得できます。

説明では「表形式での出力」となっています。タグ名を複数セットすると、値がタブ区切りで出力されます。

-b オプションではもっと直接的に値だけを取得できます。タグ名をひとつだけ指定して取得する場合は -b で値のみサクッと取得できます。ただし複数のタグを指定すると、値が区切りなく取得されてしまいますので使い物になりません。

区切りを付けて出力する方法があるような気がしますし、もしかしたら見えない区切りで区切られているのかもしれません。そういうのを扱えるデジタル強者なら -b は使い勝手がいいかもしれません。

私はもっぱら -T を使っています。

 -T と -b の微妙な違い

例えば FileSize を取得するシンプルなコードを実行させます。

exiftool -T -filesize パス
exiftool -b -filesize パス

どちらも値が取得できますが、-T では整形された形式、-b では生データが取得されます。

-T の結果: 1085 KiB

-b の結果: 1111018

-b はバイナリを取得するオプションなのでこうなります。

日付の書式を変更したい -d

日付関連のタグでは値が 2021:06:08 02:44:03+09:00 こんな感じで返ってきます。最初は +9:00 と書かれているので9時間足さねばならないかと思いましたが、これはただタイムゾーンを示しているだけでした。足さなくていいです。

この書式を変更できます。 -d オプションを使います。

-d %Y/%m/%d_%H:%M:%S

このように指定すると

2021/06/08_02:44:03

こう返ってきます。

-d に続けて書式を書くわけですが、スペースを含めると上手くいきません。エスケープの “\” を付けても駄目です。そこで

-d '%Y/%m/%d %H:%M:%S'

このようにクォーテーションで括ってやると中にスペースを置けます。

グループごとにゲットしたい -g

-g オプションはグループごとにタイトル付きでまとめてくれます。
—- Exif —-, —- File —-,  —- IPTC —- とグループ名が書かれて、グループごとにデータがまとめられて出力されます。

日本語のタグ名で出力してほしい -lang ja

-lang ja オプションで可能な限り日本語で返してくれます。

フォルダ内のフォルダのファイルも処理したい

exiftool フォルダパス と書けばフォルダ内のファイルのメタデータをだーっと取得しますが、指定フォルダ内にさらにフォルダがある場合、その中身については無視します。

フォルダ内のフォルダも全部ひっくるめて処理したいときは、-r オプションを使用します。

exiftool -r フォルダパス

これでサブフォルダ内のファイルもすべて処理してくれます。

複数ファイルの出力を変更したい -T とか -j

複数ファイルの処理をするとき、普通は「======」でファイルを区切って出力されます。例えばこんな。

 

======== /Users/user/Desktop/untitlefolder/fileName.png
ExifToolVersion : 12.29
FileName : fileName.png
Directory : /Users/user/Desktop/untitlefolder
fileSIze: 98 KiB
....
======== /Users/user/Desktop/untitlefolder/fileName2.png
ExifToolVersion : 12.29
FileName : fileName2.png
Directory : /Users/user/Desktop/untitlefolder
fileSIze: 426 KiB
....

 

こういう出力です。後で何かに利用するとき不便です。そこで、先ほど「タグの値だけを取得したい」で取り上げた -T が活躍します。 -T を付けることで、タブ区切りの表形式で出力されます。

あるいは、難しいことに得意な人にとっては JSON 出力が可能です。 -j です。

出力データを他で利用する際に有効利用できるでしょう。csvファイルとして出力することもできます。

CSVに書き出したい

exiftool -csv パス > 出力先パス

csvファイルに書き出すには -csv> 出力先パス を書くと良いようです。pbcopyというコマンドを知らないときはcsvファイルを中継として仕方なく書き出していました。

出力をクリップボードにコピーしたい

ExifToolの使い方から外れますが、pbcopy は 出力をクリップボードにコピーする処理です。「 | 」で区切って命令します。ExifToolの出力をコピーしたいならこのように書きます。

exiftool -s パス | pbcopy

あとはデータを利用したいアプリに切り替えて必要な箇所にペーストするだけ。出力をコピーする処理、私は個人的にめちゃ使います。

※ pbcopy は Mac 用のコマンドで、LinaxやWindowsにもそれぞれ同じ目的のコマンドがあると思います。

ファイルのタグを編集したい

タグ名=値 と書くと編集またはタグの追加ができます。

exiftool -タグ名=値 パス

タグ名にイコールを付けて値を書くとそのタグを書き換えまたは追加できます。イコールの前後にスペース入れてはいけませんよ。

exiftool -copyright=Digitalboo パス

と書けばCopyrightに「Digitalboo」がセットされます。

exiftool -s -copyright= パス

と、書けば( =の後ろにスペース )Copyrightタグが削除されます。

メタ情報をすべて削除したい

写真ファイルからすべてのメタ情報を削除したいこともあります。全部消すには

exiftool -all= パス

このように書けばいいでしょう。”-all= “ =の後ろがスペースであることが重要ですよ。全てのタグを「 」なしにする、と命じています。メタ情報が全部消えます(ファイル属性や基本的なタグは残ります)

タグを編集したら「?」になったり文字化けすることを防ぎたい

タグを編集すると、日本語が文字化けしたり「?」になったりします。特に Keywords で起こりませんか。この不可解はどういうことだろうと頭を抱えますが、それは、IPTCタグだからという可能性が高いです。IPTC は何もしないでいると UTF=8 ではなくアスキー文字として受け取るようです。だから化けます。キャラセットの対処しておきましょう。

-iptc:all -codedcharacterset=utf8

これを加えておきます。

※ あらら。すでに下のエラーに対処に書いていました。まあでも基本の分類の中にあってもいいですよね。書いた本人が見逃したくらいですから。

タグを編集したときに「_original」を作らず直接上書きしたい

タグを追加・編集すると、デフォルトでオリジナルファイル末尾に「_original」を付与して保存し、編集したファイルが新規に作成されます。

安全性の高いありがたい機能ですが、あえてこれが不要なときもあります。

-overwrite_original を付ければ「_original」が作成されません。直接ファイルが改変され新たに保存されます。

これは単に上書きというより、新規作成しての上書きです。つまり元のファイルは削除され、新しいファイルと置き換えられます。ファイル作成日、変更日がすべて本日この時になりますのでご注意を。他にもファイル属性のタグが失われる可能性があります。重要なファイルに迂闊に使用してはなりません。
日付を何とかしたい場合は別途修正するコマンドもありますが → 日付を変更するコマンド

と、書いておりましたが、それよりいいのがありました。

-overwrite_original_in_place は、元ファイル属性を保持します。Macでは、元のファイルの作成日、タイプ、作成者、ラベルの色、アイコン、Finderタグ、その他の拡張属性、およびファイルへのハードリンクが保持されます。こちらは一時ファイルの作業を挟みつつ最終的に元データを更新する仕組みなので情報が元のまま保持されるんですね。

少しステップが増えるので僅かにパフォーマンスが低下します。また、FileNameや Directory タグを同時に変更するような処理を行うと -overwrite_original と同じ挙動に戻ります。

Google Maps で検索できるGPS表記をゲットしたい

ExifTool で GPS情報を取得できます。GPSLatitude(緯度)GPSLongitude(経度)あるいは GPSPosition(緯度, 経度)があれば場所が特定できますね。特定できれば Google Mpas で表示してみたいところ。でも簡単にはいきません。

Google Maps では検索窓に「緯度,経度」と入れてリターンすると場所が表示されます。使用できる形式は次のとおりです。

度(DD): 41.40338, 2.17403
度分秒(DMS): 41°24’12.2″N 2°10’26.5″E
度分(DMM): 41 24.2028, 2 10.4418
緯度と経度の座標で位置を確認または検索する – マップヘルプ

ExifTool でゲットした経度と緯度をそのまま使っても何も起きません。

GPSLatitude : 34 deg 51' 51.71\ N

こんな感じの形式で出力されるからです。でも大丈夫。ExifTool のオプションで出力形式を指定する方法があります。

-c FMT を使います。

FMT に出力形式を指定します。ExifTool のマニュアルでは次のような例が載っています。

         FMT                  Output
    -------------------    ------------------
    "%d deg %d' %.2f"\"    54 deg 59' 22.80"  (default for reading)
    "%d %d %.8f"           54 59 22.80000000  (default for copying)
    "%d deg %.4f min"      54 deg 59.3800 min
    "%.6f degrees"         54.989667 degrees

GoogleMapsの指定形式とFMTの例を見比べながら調整してみましょう。まずはこれ。

 -c "%d°%d'%.2f"\"

度分秒(DMS): 41°24’12.2″N 2°10’26.5″E のように出力されます。

結果をgoogle maps の検索窓にペーストすれば場所が特定されます。

ただし、フォーマット指定に ” とか ‘ が入っていて紛らわしく、ターミナルではいいのですが do script などを使う場合に難易度が上がるのでもっと簡素に表示させたい。

-c "%.6f"

度分(DMM): 41 24.2028, 2 10.4418 のような出力をされます。進数が異なる計算結果ですね。これでもイケました。これだと “%.6f” を ‘%.6f’ と書いても問題ないし、使い回し的によろしいでしょう。

オプションを指定せず、結果を整形するもよし

オプションを指定せず、結果を「文字列の検索置換」でちょっと整形してやるだけでもOKですね。

34 deg 51′ 51.71\ N → 34°51’51.71N 変換

・「 」(スペース)を消す
・「deg」を 「°」に置換
・「\」を消す

ということで、理解力が低すぎて「これでええのかな」と思いつつ、Google Maps の検索窓にコピペで使えるGPS情報についてでした。

GPS 緯度経度をExifに書き込みたい

逆に、GoogleMap で指定したポイントから緯度経度を取得してそれを GPS に書いて埋め込みたいという希望があるかもしれません。

GoogleMap で指定したポイントでコントロールクリックしてコンテキストメニューを表示させると、一番上に表示されるのが緯度・経度です。選択するとクリップボードにコピーしてくれます。

この数値はカンマを挟んで緯度, 経度なので、GPSLatitude と GPSLongitude にセットします。

exiftool -GPSLatitude=35.01468 -GPSLongitude=135.74808 目的PATH

上で書式についてあれこれ書きましたが、タグの埋め込みではGoogleMapがコピーしてくれるこの数字をそのまま書いてOKでした。

 

ペンギンアイコン mini

基本的なことと言いつつ、追記に次ぐ追記で、やや基本から逸脱しておりますが、基本的なことは以上です。マニュアルによるととても複雑なこともできるようですが自分には基本の機能で十分だと思えました。

以下、タグとオプションをマニュアルページから引用して日本語付けてリストしました。より詳しい説明や使い方は公式ページやマニュアルでどうぞ。

タグ操作と入出力テキストフォーマット
タグ操作
-TAG or –TAG 指定したタグを抽出または除外する
-TAG[+-^]=[VALUE] タグの新しい値を書き込む
-TAG[+-]<=DATFILE ファイルの内容からタグの値を書き込む
-TAG[+-]<SRCTAG タグの値をコピーします(-tagsFromFile参照)。
-tagsFromFile SRCFILE ファイルからタグの値をコピーする
-x TAG (-exclude) 指定したタグを除外します。
入出力テキストのフォーマット
-args (-argFormat) メタデータをexiftoolの引数としてフォーマットします。
-b (-binary) メタデータをバイナリ形式で出力します。
-c FMT (-coordFormat) GPS座標のフォーマットを設定します。
-charset [[TYPE=]CHARSET] 特殊文字のエンコーディング指定
-csv[[+]=CSVFILE] タグをCSV形式でエクスポート/インポートする
-csvDelim STR CSVファイルのデリミタを設定します。
-d FMT (-dateFormat) 日付/時刻の値のフォーマットを設定します。
-D (-decimal) タグのID番号を10進数で表示します。
-E,-ex,-ec (-escape(HTML|XML|C)) タグの値をHTML、XML、Cのいずれかにエスケープします。
-f (-forcePrint) 指定したすべてのタグを強制的に出力します。
-g[NUM…] (-groupHeadings) タググループごとに出力を整理します。
-G[NUM…] (-groupNames) 各タグのグループ名を表示します。
-h (-htmlFormat) 出力にHTMLフォーマットを使用します。
-H (-hex) タグのID番号を16進数で表示します。
-htmlDump[OFFSET] HTML形式のバイナリダンプを生成します。
-j[[+]=JSONFILE] (-json) JSON形式でタグをエクスポート/インポートします。
-l (-long) 長い2行の出力形式を使用します。
-L (-latin) Windows の Latin1 エンコーディングを使用します。
-lang [LANG] 言語を設定
-listItem INDEX リストから特定の項目を抽出します。
-n (–printConv) 出力変換を行いません。
-p FMTFILE (-printFormat) 指定されたフォーマットで出力します。
-php タグを PHP の配列として書き出します。
-s[NUM] (-short) 短い出力形式
-S (-veryShort) 非常に短い出力形式
-sep STR (-separator) リストアイテムのセパレータ文字列を設定します。
-sort 出力をアルファベット順に並べ替えます。
-struct 構造化された情報の出力を可能にする
-t (-tab) タブ区切りのリスト形式で出力します。
-T (-table) 表形式での出力
-v[NUM] (-verbose) 冗長なメッセージを表示します。
-w[+|!] EXT (-textOut) 出力テキストファイルを書き込む(上書きする!)
-W[+|!] FMT (-tagOut) 各タグごとに出力テキストファイルを書く
-Wext EXT (-tagOutExt) -W で指定されたファイルタイプのみ書き込みます。
-X (-xmlFormat) RDF/XML 出力形式を使用します。
処理制御
a (–duplicates) 重複するタグの抽出を許可します。
-e (–composite) 複合タグを生成しません。
-ee[NUM] (-extractEmbedded) 埋め込みファイルから情報を抽出します。
-ext[+] EXT (-extension) 指定した拡張子のファイルを処理します。
-F[OFFSET] (-fixBase) メーカーノートのオフセットのベースを固定します。
-fast[NUM] メタデータを抽出する際の速度を上げる
-fileOrder[NUM] [-]TAG ファイルの処理順序を設定します。
-i DIR (-ignore) 指定したディレクトリ名を無視する
-if[NUM] EXPR 条件付きでファイルを処理する
-m (-ignoreMinorErrors) マイナーなエラーや警告を無視します。
-o OUTFILE (-out) 出力ファイルまたはディレクトリ名を設定する
-overwrite_original ファイルの名前を変えてオリジナルを上書きする
-overwrite_original_in_place(上書き) tmpファイルをコピーして上書きします。
-P (-preserve) ファイルの更新日時が保存されます。
-password PASSWD 保護されたファイルを処理するためのパスワード
-progress[:[TITLE]] ファイルの進捗状況を表示します。ファイルの進捗状況を表示します。
-q (-quiet) 処理を静かにします。
-r[.] (-recurse) サブディレクトリを再帰的に処理します。
-scanForXMP ブルートフォースXMPスキャン
-u (-unknown) 未知のタグを抽出します。
-U (-unknown2) 未知のバイナリタグも抽出する
-wm MODE (-writeMode) タグの書き込み/作成のモードを設定します。
-z (-zip) 圧縮された情報を読み書きする

 

Warning (警告)やエラー に対処

LargeFileSupport – 大きなファイル

使用していて気づいたのですが、ビデオファイルのExifを取得するとき、中途半端にしか取得できない事があります。

exiftool 取得タグが少ない
種類QuickTimeのタグが3つくらいしかない

タグをよく見ると、Warning がありました。

Warning: End of processing at large atom (LargeFileSupport not enabled)

何を言ってるんでしょう?

「large atom での処理終了(LargeFileSupport が有効でない)」

だそうです。でかいファイルを扱うときは LargeFileSupport を有効にしなければならないようですね。それってどうやるの?

フォーラム https://exiftool.org/forum/index.php?topic=3916.0 の会話の中に答えらしきものがありました。説明書内にもあると思いますがフォーラムが先にヒットしたので。

オプションで -api largefilesupport=1 を追加すればいいよということです。早速試しましょう。コマンドのオプションの中に -api largefilesupport=1 を紛れ込ませます。

exiftool -s -api largefilesupport=1 パス

さっきはQuickTimeのタグが3つしかありませんでしたが、一気に60行くらい取得できました。

exiftook 全て取得
すべて取得できた

てっきり、ファイルにメタデータがちゃんと保存されていないのだと思って諦めていましたが、でかいファイルの制限があったとは知りませんでした。

ExtractEmbedded – より多くのタグ

次のWarning はこれについてです。マイナーな警告で無視していいんですが、より多くのタグを見つける可能性があるとの指摘です。

Warning: [minor] The ExtractEmbedded option may find more tags in the media data

説明にはこうあります。

-ee[NUM]    (-extractEmbedded)   Extract information from embedded files

"埋め込まれたファイルから情報を抽出します。"

メディアファイルに埋め込まれたファイルの情報を抽出しますね。より多くのタグをいただきましょう。タグに -ee を追加します。

また、次のようにも説明されています。

When -ee (-extractEmbedded) is combined with -p, embedded documents are effectively processed as separate input files.

“-ee に -p を組み合わせることで、埋め込まれたドキュメントを別の入力ファイルとして効果的に処理します。
Exiftool Documentation

EPSファイルに埋め込まれた文書、PDFファイルに埋め込まれたEPS情報やJPEG・Jpeg2000画像、JPEG・MPOファイルに埋め込まれたMPF画像、AVCHDビデオのストリーミングメタデータ、Mac OSファイルのリソースフォークから情報を抽出します。

GPSに関する事柄や、[NUM] で解析範囲を指定することなどがいろいろ書かれていますね。だんだん訳わからなくなってきたのであとはおまかせします。なんせ -ee をつけるといっぱい情報が得られますよということでした。

Warning: Some character(s) could not be encoded in Latin / タグ編集時の日本語の文字化け

タグを編集すると、日本語が「??」になったり、化けることがあります。特にkeyword や headline の日本語が「??」と化ける場合、それは、このタグが IPTCのタグであるからです。

IPTC の文字の解釈は独自で、utf8 で書いても上手く認識されず化けるらしいです。特別に対処が必要と知りました。以下のタグを加えます。

-iptc:all -codedcharacterset=utf8

https://exiftool.org/faq.html

これに関してはドハマりしていたのですが、ようやく解決。

ExifToolを使う

実際に普段どのように使用しているかというと、ターミナルのウインドウに「exiftool -s 」と手入力し、メタデータを知りたいファイルをドラッグしてリターンします。

ターミナルのウインドウにメタデータがだーっと出てきますから確認します。さっと確認するだけ。そんな使い方が結局多いですね。

ターミナルウインドウ

データを眺めるだけでなく他のアプリで利用するには -csv を付けてファイルに書き出したりしていましたが、pbcopy コマンドを知ってからはもっぱらクリップボードにコピーして利用しています。

 

応用して使う

タグのキーを追加したり値を編集できますので応用範囲はとても広いです。日付の調整やキーワードの編集、そして画像ファイルに著作権情報を追加で入力するということもよくやります。

追加や編集に関しては手入力が面倒なので、変数部分を自由に設定して扱える自作マイコード管理ファイルを使っています。

FileMaker CodeManagement
自作のコード実行マシン(FileMakerファイル)

これはFileMakerでして、テンプレートを置く → レコードに準じたデータを当てはめてコードを生成 → AppleScriptを実行ステップを使ってターミナルに送信(その後、結果をコピーして再びFileMaker持ってくることも)という手順を行う自動処理マシンです。個人的にはAutomatorより優秀😀

こうした利用方法を使い始めてから突如 Exiftool の使用頻度が上がりました。それついてはFileMaker関連の投稿でまた改めて。
-> Macで実行可能なFileMakerコード管理 CodeManager

FileMaker の話ばかりですいません。メディア管理のメタデータ取得と利用についてのExifTool記事。

-> FileMaker メディア管理 – メタデータの取得と利用(LEVEL 5 ExifTool 編)

本ポストはとりあえず ExifTool のかんたんメモ(自分用)ということで、ここらでごめんください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください