写真取り込み&EXIF情報にあわせてファイル名を変更

デジタルカメラやメモリカード、iPhoneなどから、まったりと「イメージキャプチャ」で OSX 上に画像を取り込み、Exif.Photo.DateTimeOriginal の値に従ってファイル名を変更するための Automator 用シェルスクリプト。まったりと手抜きで書いてみたところ。





2010年7月10日14時20分40秒に撮影された DSC_0035.JPG20100710_142040_DSC_0035.JPG にするイメージで。

最初は exiftool を叩いていたんやけど、数百枚の画像取り込みとかだとリネームが卒倒しそうなくらい遅すぎるので、MacPorts 使って exiv2 を入れることに。シェルスクリプトから叩く程度の安直さであれば、まあこの辺りが手をかける限界かなと。

手元のマシンが G4 MDD Dual なので Leopard どまり。ということで Xcode 3.1.4 をとってきて入れたのちに sudo port install exiv2 で準備完了。


[Automator bash script]

# exiv2 は MacPorts で入れてるので path を追加
export PATH=${PATH}:/opt/local/bin

# exiv2 が見つからなければ終了
if ! which exiv2 2>&1 > /dev/null ; then
        exit 1
fi

for f in "$@"; do
        # EXIF にキー Exif.Photo.DateTimeOriginal が含まれている場合のみ
        if exiv2 -Pk "${f}" | grep -q Exif.Photo.DateTimeOriginal ; then
                DIR=$(dirname "${f}")
                ORIG_FILE=$(basename "${f}")
                # 既に日付がファイル名に含まれている場合はいったん削除
                NEW_FILE=$(echo "${ORIG_FILE}" | sed "s/\([0-9]\{8\}_\)\([0-9]\{6\}_\)*//")
                if [ "${ORIG_FILE}" != "${NEW_FILE}" ] ; then
                        if [ -f "${DIR}/${NEW_FILE}" ]; then
                                mv -f "${DIR}/${NEW_FILE}" "${DIR}/backup_${NEW_FILE}"
                        fi
                        mv -f "${DIR}/${ORIG_FILE}" "${DIR}/${NEW_FILE}"
                fi
                # EXIF データに基づいてファイル名を変更
                exiv2 -r'%Y%m%d_%H%M%S_:basename:' rename "${DIR}/${NEW_FILE}"
        fi
done

Automator ワークフロー上で「写真をダウンロード」の代わりに「選択された Finder 項目を取得」にすれば、既にディスク上に取り込んでいる画像ファイルのリネームにも使えます (が、肝心の「選択された Finder 項目を取得」自体が激遅なので、素直に Terminal からスクリプトを実行するのがいいかと)。

いまどきはファイル名なんかは気にせずに、Picasa などで閲覧・管理というのが主流なんでしょうが、まあなんとなく。適当に手抜きで。





Pages

Powered by Movable Type 4.23-en

About this Entry

This page contains a single entry by Shaolin published on July 12, 2010 9:17 PM.

ルーテシア2 ダッシュボード脱着 was the previous entry in this blog.

Phoenix Slides is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.