#! /bin/sh # # exifname -- EXIFのタイムスタンプ情報を用いてファイル名を変更する # # Usage: exifname [-t] [-r] [-n] [-v] [file]... # -t: ファイルのタイムスタンプを変更する # -r: ファイル名の変更を行わない # -n: 実際の変更を行わない # -v: 実行するコマンドを表示する # # ファイル名を「P<数字>.JPG」形式から「p<月><日><番号>.jpg」にする # printf(3) 形式で書けば「"p%1.1x%02d%04d.jpg", 月, 日, 番号」 # # 例: 5月20日に撮影した152番のファイルは p5200152.jpg に # 12月24日に撮影した69番のファイルは pc240069.jpg に # # 0.0: Apr. 29, 2006 by Dai ISHIJIMA # export LC_ALL=C touch=NO rename=YES verbose=NO #action=NO action=YES checkbytes=2048 # オプションを調べる while [ "$#" -gt 0 ]; do case x"$1" in x-t) touch=YES shift ;; x-r) rename=NO shift ;; x-n) action=NO shift ;; x-v) verbose=YES shift ;; x-*) echo "Usage: $0 [-t] [-r] [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 rename" 1>&2 echo "Usage: $0 [-t] [-r] [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]*) # ファイル名に付ける日付情報 pdate=`echo $stamp | tr ':' ' ' | awk '{printf "%1.1x%02d", $2, $3}'` # touch(1) のタイムスタンプ形式に tstamp=`echo $stamp | tr -d ': ' | sed 's/\([0-9][0-9]\)$/.\1/'` # 元ファイル名から番号を number=`echo $pic | sed 's/.*[Pp][0-9][0-9][0-9]\([0-9][0-9][0-9][0-9]\)\.[Jj][Pp][Gg]$/\1/'` newname=`echo $pic | sed 's/[Pp][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\.[Jj][Pp][Gg]$/'"p$pdate$number.jpg"'/'` case x"$number" in x) echo "$0: bad file no: $number, $pic" 1>&2 ;; *) case x"$touch" in xYES) case x"$verbose" in xYES) echo touch -t "$tstamp" "$pic" ;; esac case x"$action" in xYES) touch -t "$tstamp" "$pic" ;; esac ;; esac case x"$rename" in xYES) case x"$verbose" in xYES) echo mv "$pic" "$newname" ;; esac case x"$action" in xYES) mv "$pic" "$newname" ;; esac ;; esac ;; esac ;; esac done exit $status # EOF