前編の続きです。
前編でシェルプログラムについての説明をし忘れましたが、 bash を使用しています。ここで紹介しているシェルスクリプトを動作させるためには、Automatorのワークフローでのシェルスクリプトを実行アイテムのシェルの選択欄で /bin/bash を指定する必要があります。
さて、前編で 4 種類のシェルスクリプトを紹介しましたが、ほとんど共通の内容で構成されているため、共通のものはまとめて説明していこうと思います。
http://masabossa.typepad.jp/typepad/2009/10/automatorを使ってexif情報を活用しながら写真をmacに取り込む-前編-私の使い方-写真-6.html
上のリンクが前編のページです。リンクをクリックすると新ウィンドウもしくは新タブでページが表示されますので、この記事とあわせてご覧ください。
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
ViviCam 5050用とiPhone 3GS用の写真ファイルに関するシェルスクリプトの冒頭に出てくるこの記述は、ExifToolの場所を設定しています。ViviCam 5050用とiPhone 3GS用の動画ファイルを操作するシェルスクリプトにはこの記述はありません。Automatorのワークフローで写真ファイル操作用シェルスクリプトのところで実行され、そのあと実行される動画ファイル操作用シェルスクリプトでも設定が引き継がれますので、動画ファイル操作用シェルスクリプトで記述する必要がないのです。
なお、ExifToolのインストール場所が異なる場合はここで指定します。
TODAY=`date "+%Y%m%d"`
これはAutomatorアプリケーションを実行する日付を「YYYYMMDD」というフォーマットで TODAY と私が勝手に命名した変数に格納しています。全てのシェルスクリプトの最後に「${TODAY}.cstxt」という箇所がでてきますが、これはログファイルです。このログファイルのファイル名として使用しています。
PICT_PATH="/Users/masabossa/Pictures/DigitalCamera"
PICT_PATH_TO="/Users/masabossa/Pictures/ViviCam5050"
これも PICT_PATH 、PICT_PATH_TO は私が勝手につけた名前の変数です。PICT_PATHに写真(動画)を取り込んだ先のファイル場所、PICT_PATH_TOに写真(動画)ファイル名を変更した後のファイルの保存場所を指定しています。
写真の取り込み先や保存場所を変更したいときはここで指定します。
for f in "$@"
do
(ファイルごとの処理内容)
done
これはAutomatorのFinder項目の検索アイテムで検索されたファイルの場所と名前の情報のリストから 1 ファイルずつ場所と名前の情報を f という変数に格納して、「do ~ done」で囲まれた処理をリスト内のファイルの数だけ繰り返すという意味です。「do ~ done」のなかで f という変数に入っている値は $f で利用することができます。
exiftool -r -overwrite_original '-FileName<DateTimeOriginal' -d ${PICT_PATH_TO}/%Y/%Y%m/%Y%m%d_%H%M%S.%%le -geotag= "$f"
これは ExifTool を使用して ViviCam 5050 の写真に記録されているExifデータを次のように操作しています。
- -r はサブディレクトリ(サブフォルダ)のファイルもExifToolでの処理対象にするということを指示するオプションです。私の場合、写真の取り込み先にサブディレクトリはないのですが、万が一サブディレクトリに写真が取り込まれてもこのオプションが指定されていれば処理されます。
- -overwrite_original は元のファイルをExif情報を記録したファイルで上書きします。このオプションを外せば上書きはされず、元のファイルが別のファイル名に変更されて残ると思います。
- '-FileName<DateTimeOriginal' は Exif情報のオリジナル日付をファイル名にするということを指定しています。
- -d ${PICT_PATH_TO}/%Y/%Y%m/%Y%m%d_%H%M%S.%%le は PICT_PATH_TO の変数に入っている保存場所のディレクトリの下にExif情報のオリジナル日付を使用した名称のサブディレクトリ名とファイル名で保存するということを指定しています。
「%Y」は「2009」といった「YYYY」フォーマットの年を表し、「%Y%m」は「200910」といった「YYYYMM」フォーマットの年月を表していて、ディレクトリ名として指定しています。
「%Y%m%d_%H%M%S.%%le」の「%Y%m%d_%H%M%S」は「20091002_204507」といった「YYYYMMDD_HHMIDD」フォーマットの日時を表しています。「.%%le」は元のファイルの拡張子を小文字にしたものを新たに拡張子とするということを表しています。「.JPG」だったら「.jpg」になります。
「%%」と2個あるのは前の「%」が後ろの「%」をエスケープするという意味で、エスケープしないといけないようです。「%」よって、つづく「l」は小文字を意味し、「e」は拡張子を意味しています。(「%」がないと単に「le」という文字と解釈されます) - -geotag= はExif情報のGPS情報部分を全て削除することを指定しています。「=」の後ろが何もないので削除という意味になっているようです。
- "$f" は「$f」のなかにひとつ前の段落で説明した取り込んだファイルのディレクトリ名とファイル名の情報が入っているのでそのファイルを処理するようにExifToolに伝えています。
「"」で囲っているのは、「IMG_XXX 1.JPG」のようにファイル名にスペースが入ることがあり、スペースも含めた文字列がファイル名であってもいいようにそうしています。これがないと、万が一ファイル名にスペースが入っていた場合にExifToolはファイルを認識できず処理されません。
なお、写真ファイルの保存場所やファイル名を変更するときは「${PICT_PATH_TO}/%Y/%Y%m/%Y%m%d_%H%M%S.%%le」を編集します。
exiftool -overwrite_original -Make=Apple -Model=iPhone -ALLDates="${DATE_YYYYMMDDHHMISS}" -geotag= "$f"
こちらは ExifTool を使用して iPhone 3GS から取り込んだ写真のExif情報に日付関連のデータを記録しています。
- -overwrite_original は元のファイルをExif情報を記録したファイルで上書きします。このオプションを外せば上書きはされず、元のファイルが別のファイル名に変更されて残ると思います。
- -Make=Apple はExif情報のメーカー情報の箇所に「Apple」と書き込むことを指定しています。
「Apple」は iPhone 3GS 純正のカメラアプリケーションで撮った写真のメーカー情報と同じです。 - -Model=iPhone は Exif情報の機器情報の箇所に「iPhone」と書き込むことを指定しています。
「iPhone」は iPhone 3GS 純正のカメラアプリケーションで撮った写真の機器情報と同じです。 - -ALLDates="${DATE_YYYYMMDDHHMISS}" はExif情報の日時関連の情報箇所の全てに対して、 DATE_YYYYMMDDHHMISS の変数に入っている日時情報を書き込みます。DATE_YYYYMMDDHHMISSに入っている日時情報は「YYYY/MM/DD HH:MI:SS」というフォーマットになるようにしています(後述)。
- -geotag= は先ほど説明したのと同じです。 iPhone 3GS ではGPS機能を許可して写真撮影すると位置情報が写真ファイルのなかに記録されてしまい、そういった写真を flickr やブログに公開すると自宅や職場などの位置特定ができてしまいますので、私は積極的にGPS情報を削除しています。ただし、現行の Toy Camera
で撮影してもGPS情報は写真に記録されません。でも私は万が一のことを考えてGPS情報があろうがなかろうが確実に除去しておきたいと思っています。
- "$f" も先ほど説明したのと同じです。
DATE_YYYYMMDDHHMISS=`stat -f "%m%t%Sm" -t "%Y/%m/%d %H:%M:%S" "$f" |cut -f2-`
DATE_YYYYMMDD_HHMISS=`stat -f "%m%t%Sm" -t "%Y%m%d_%H%M%S" "$f" |cut -f2-`
シェルスクリプトのなかで上のような「`stat -f 〜 -f2-`」というのがところどころでてきますが、ここではファイル情報としてのファイルの作成日時を抽出しています。プログラムで実行した結果を左辺の変数に入れるときプログラムのコマンドを「`」で囲みます。「stat」というのはファイルの状態(status)を表示するプログラムです。ファイルのいろいろな状態情報が表示されるので「-f」オプションで日付を表示するように指定し、「-t」オプションで日時のフォーマットを指定しています。最後に「"$f"」で処理する写真や動画のファイルを指定しています。これだけだと余計な情報も出てくるので、「|」につづけて「cut」というプログラムで余計な情報を表示しないように除外しています。
先ほどExifToolの説明で触れましたが「DATE_YYYYMMDDHHMISS」の日時フォーマットは「%Y/%m/%d %H:%M:%S」を指定しています。これはExifToolを使用してExif情報の日時情報を書き込むときの日時フォーマットです。
FILE_EXT=`echo "$f" | sed -e 's/^.*\.\([^\.]*\)$/\1/' | tr "[:upper:]" "[:lower:]"`
これはファイルの拡張子がJPGなど大文字だったり、小文字だったり統一されていないのが気になるので、拡張子を全て小文字にする処理です。
「echo "$f"」でファイルの場所とファイル名の情報を「sed」に渡して、「sed」で正規表現という手法でファイルの拡張子を抽出しそれを今度は「tr」に渡して、「tr」でファイルの拡張子の情報のうち大文字の文字を小文字に一律に変換するようにしています。とりあえずこの一文で拡張子が大文字から小文字になります。なお、「"[:upper:]"」と「"[:lower:]"」を入れ替えれば拡張子は大文字に統一されます。
echo ${NEW_FILENAME} >> ${PICT_PATH}/${TODAY}.cstxt
これは、処理した日付がファイル名となっているテキストファイルに、処理によってファイル名が変更された写真や動画のファイル名を書き出しています。いわゆるログです。
というわけで、前編のシェルスクリプトの説明でした。
ここで注意事項です。Automatorアプリケーションやシェルスクリプトを実行してファイル名を変更する場合は消えてしまってもいいテスト用のファイルを使用して事前に動作を確認してください。私はシェルスクリプトを実行しながらシェルスクリプトを作成したのですが、その最中に何度かファイルがどこかに消えてしまったことがありました。くれぐれもご注意ください。
さて、ここで紹介している方法では写真や動画はイメージキャプチャで Mac に取り込むことを想定しています。イメージキャプチャは写真や動画を取り込んだあとに指定したアプリケーションを実行することができます。私は、ViviCam 5050から写真を取り込むときには、ここで説明したAutomatorアプリケーションをイメージキャプチャの自動処理で指定しています。ViviCam 5050から写真を取り込んだらファイル名変更が連続して行われるのでちょっとした楽ができます。
<取り込み後にRenameAndMove.appというAutomatorアプリケーションが実行されるようにしています>
ただし、iPhone 3GSから写真や動画を取り込むときは自動処理でAutomatorアプリケーションを指定せず、取り込んだ後にAutomatorアプリケーションを手動で実行しています。私のiPhone 3GSの写真は Toy Camera で撮影しているためにExif情報がありません。そのためファイルの作成日時をAutomatorアプリケーションで操作する必要があり、写真や動画が撮影されてファイルが作成されたときの日時が非常に重要になります。
しかし、イメージキャプチャでMacに取り込んだあと、自動処理でAutomatorアプリケーションを指定していると、なぜかファイルの作成日時がMacに取り込んだ日時になってしまうんです。つまり実際に撮影された日時が完全に失われてしまい、自動処理でAutomatorアプリケーションによって変更されたファイル名も取り込んだ日時のファイル名となってしまいます。
一方でイメージキャプチャでMacに取り込むときに、Automatorアプリケーションなど何も指定せずに取り込めば、写真や動画が撮影されたとき(=ファイルが作成されたとき)の日時が、Mac上でもファイル作成日時となります。つまり写真や動画が撮影された日時は失われません。その状態でAutomatorアプリケーションを実行すれば写真や動画が撮影された日時が写真のExif情報に書き出され、ファイル名もその日時になります。
ところで、前編でViviCam 5050とiPhone 3GSで取り込み先フォルダを分けているという話をしました。今説明したように取り込み方法が少し異なるため、それによって問題の起きることのないように取り込み先のフォルダを分けているのです。
なお、イメージキャプチャは賢くてViviCam 5050で写真や動画を取り込むときとiPhone 3GSで取り込むときの取り込み先フォルダをきちんとおぼえておいてくれます。ViviCam 5050をUSBでつなげば、「DigitalCamera」フォルダに、iPhone 3GSをつなげば「iPhoneAddExif」フォルダがダウンロード先に指定された状態となります。
長くなりましたが、写真と動画の取り込み作業の自動化、効率化のお話はこれでおしまいです。
補足
本記事を作成するのにあたり、Apple社のアフィリエイトプログラムに登録してみました。この記事内のToy CameraのリンクをクリックするとLinkShare社に一度アクセスし、そのあとApple社にアクセスしてiTunes が起動します(※)。iTunesが起動したらToy Camera アプリケーションのダウンロードページが表示されます。よろしければ記事内のToy Cameraのリンクからアクセスしていただけるとうれしいです。本ブログに掲載しているAmazon広告と異なり、ぱっと見でそれとはわからないため補 足させていただきます。
※iTunes がインストールされていなければ、Apple社の iTunes ダウンロードページが表示されます。


コメント