#! /bin/sh # # copy-by-exif -- EXIFのタイムスタンプ情報を用いてサブディレクトリに整理 # カレントディレクトリに日付名のサブディレクトリを作成し、 # そこにコマンドラインで指定したファイルをコピーする。 # サブディレクトリの名前は「YYYY-MM-DD」形式。 # サブディレクトリ名に使う日付はEXIFのタイムスタンプから取得。 # # Usage: copy-by-exif [-n] [-v] [file]... # -n: 実際の変更を行わない # -v: 実行するコマンドを表示する # # Example: # % copy-by-exif /media/DCIM/100PANA/*.JPG # export LC_ALL=C verbose=NO #action=NO action=YES checkbytes=2048 # オプションを調べる while [ "$#" -gt 0 ]; do case x"$1" in x-n) action=NO shift ;; x-v) verbose=YES shift ;; x-*) echo "Usage: $0 [-n] [-v] [file]..." 1>&2 exit 1 ;; x*) break ;; esac done # 実際にコピーを行わないときは実行するコマンドのみを表示 case x"$action" in xNO) verbose=YES ;; esac case x"$#" in x0) echo "$0: no files to copy" 1>&2 echo "Usage: $0 [-n] [-v] [file]..." 1>&2 exit 1 ;; esac status=0 for pic in "$@" ; do # ファイルの先頭を調べ、EXIF情報からタイムスタンプを得る stamp=`head -c $checkbytes $pic | strings | grep -E '[0-9]{4}:[0-9]{2}:[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}' | head -1` case x"$stamp" in x) # タイムスタンプ情報が空の場合はエラー echo "$0: no EXIF time stamp found in $pic" 1>&2 status=1 ;; x[0-9]*) # サブディレクトリ名を生成 dname=`echo $stamp | awk '{print $1}' | tr ':' '-'` if [ ! -d $dname ]; then # ディレクトリがなければ作る case x"$verbose" in xYES) echo "mkdir -p $dname" ;; esac case x"$action" in xYES) if ! mkdir -p $dname ; then echo "$0: can't create $dname for $pic" 1>&2 status=1 fi ;; esac fi case x"$verbose" in xYES) echo "cp -p $pic $dname" ;; esac case x"$action" in xYES) cp -p $pic $dname ;; esac ;; esac done exit $status # EOF