Oct 31, 2019

exif 情報を利用した画像の整理スクリプト

iPhone で撮影した画像を macOS 標準の イメージキャプチャ などを利用して Mac に取りこんだ後、 exif 情報を参照して画像ファイルを整理するスクリプトです。
利用するためには exiftool が必要となりますので、Homebrew または MacPorts を利用して導入して下さい。

macOS 10.14.6 (Mojave) での動作を確認していますが、exiftool 以外は POSIX に準拠したコマンドしか使っていないので、 exiftool さえ準備できれば他のバージョンの macOS はもちろん、FreeBSD や Linux 上でも稼働すると思います。

  1#!/bin/sh
  2# 検索する exif タグ
  3tag="DateTimeOriginal ModifyDate CreateDate"
  4
  5# 生成する画像ファイル名に追加する文字列
  6id="_iOS"
  7
  8# 画像ファイル格納先ディレクトリ
  9base=${HOME}/CameraFiles
 10picture="Pictures"
 11movie="Movies"
 12unknown="Unknown"
 13
 14#
 15# exif 情報から画像の作成日を取得
 16#   $1: ファイル
 17#
 18getDate()
 19{
 20
 21    local   _t _d
 22
 23    for _t in ${tag}
 24    do
 25        _d=$(exiftool -${_t} "${1}")
 26        if [ -n "${_d}" ]
 27        then
 28            echo ${_d} | awk '{ print $(NF-1), $(NF)}' | sed -e 's/:/ /g' -e 's/\..*//g'
 29            return
 30        fi
 31    done
 32
 33}
 34
 35#
 36# 格納先のファイル名を生成
 37# ファイル名は ${base}/TYPE/YYYY/MM/YYYYMMDD_HHMMSSXXX_iOS.EXT の形式
 38# XXX は 000 から 999 までを自動で採番する
 39#   $1: 格納先ディレクトリ
 40#   $2: 日付 (YYYYMMDD)
 41#   $3: 時間 (YYYYMMDD)
 42#
 43getName()
 44{
 45
 46    local   _n _nn
 47
 48    _n=1
 49
 50    while [ ${_n} -le 999 ]
 51    do
 52        _nn=$(printf "%03d" ${_n})
 53        if ls "${1}/${2}_${3}${_nn}${id}"* > /dev/null 2>&1
 54        then
 55            _n=$((_n + 1))
 56        else
 57            break
 58        fi
 59    done
 60
 61    echo "${1}/${2}_${3}${_nn}${id}"
 62
 63}
 64
 65#
 66# メイン処理
 67#
 68ls -1 *jpg *png *mov | while read i
 69do
 70    # ファイルの拡張子取得
 71    ext="${i##*.}"
 72
 73    # 拡張子でサブディレクトリを指定
 74    if [ "${ext"} = "mov" ]
 75    then
 76        type="${movie}"
 77    else
 78        type="${picture}"
 79    fi
 80
 81    # exif 情報から作成日を取得
 82    set -- $(getDate "${i}")
 83    year=${1}
 84    month=${2}
 85    day=${3}
 86    time=${4}${5}${6}
 87
 88    if [ -n "${year}" ]
 89    then
 90        # 作成日が取得できた場合
 91        dst="${base}/${type}/${year}/${month}"
 92        name="$(getName "${dst}" "${year}${month}${day}" "${time}").${ext}"
 93    else
 94        # 作成日が取得できない場合
 95        dst="${base}/${type}/${unknown}"
 96        name="${dst}/${i}"
 97    fi
 98
 99    # 格納先ディレクトリ作成
100    mkdir -p "${dst}"
101    # ファイル格納
102    cp "${i}" "${name}"
103done
    

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.