#! /bin/sh # # exif-date-folder -- EXIFのタイムスタンプ情報を用いてフォルダに分類 # # Usage: exif-date-folder [-d dstdir] [file]... # # 簡単な説明 # JPEG/JFIFファイルを読んで、埋め込まれたEXIFタイムスタンプを取得する。 # EXIFタイムスタンプを年と月日に分解する (YYYY/MMDD)。 # そのファイルを「コピー先/YYYY/MMDD/元ファイル名」にコピーする。 # コピー先のファイルのタイムスタンプにEXIFタイムスタンプを反映する。 # # revision history # 0.0: Apr. 29, 2006 by Dai ISHIJIMA (as exifname) # 0.1: Oct. 13, 2010 (as exifstamp) # 0.2: Dec. 17, 2015 # export LC_ALL=C checkbytes=4096 dstdir=. # コピー先 action=YES # 実際にコピーするか verbose=NO # 動作を報告するか touch=YES # EXIFのタイムスタンプをファイルのタイムスタンプに反映するか # オプションを調べる while [ "$#" -gt 0 ]; do case x"$1" in x-d) shift; dstdir="$1" shift; ;; x-t) touch=YES shift ;; x-T) touch=NO shift ;; x-v) verbose=YES shift ;; x-n) action=NO shift ;; x-*) echo "Usage: $0 [-v] [-n] [-d dstdir] [file]..." 1>&2 exit 1 ;; x*) break ;; esac done # 実際にコピーなどを行わないときは実行するコマンドのみを表示 case x"$action" in xNO) verbose=YES ;; esac # 処理するファイルは指定されている? case x"$#" in x0) echo "Usage: $0 [-n] [-v] [file]..." 1>&2 exit 1 ;; esac # コピー先は書き込み可能? if [ ! -d $dstdir ]; then echo "${0}: destination $dstdir not found (or not writable)" 1>&2 exit 1 fi # ここから実行部分 for p in "$@" ; do if [ ! -r $p ]; then echo "${0}: $p not found (or not readable)" 1>&2 continue fi # ファイルの先頭を調べ、EXIF情報からタイムスタンプを得る stamp=`head -c $checkbytes $p | 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) # タイムスタンプ情報が空の場合は00000000000000 # YYYYMMDDhhmmss fstamp="00000000000000" tstamp="" case x"$verbose" in xYES) echo "${0}: file $p has no exif timestamp" 1>&2 ;; esac ;; x[0-9]*) fstamp=`echo $stamp | tr -dc '[0-9]'` tstamp=`echo $stamp | tr -d ': ' | sed 's/\([0-9][0-9]\)$/.\1/'` ;; esac # 年月日を取り出す yyyy=`echo $fstamp | sed 's/^\([0-9][0-9][0-9][0-9]\).*/\1/'` mmdd=`echo $fstamp | sed 's/^....\([0-9][0-9][0-9][0-9]\).*/\1/'` if [ ! -d "$dstdir/$yyyy/$mmdd" ]; then case x"$verbose" in xYES) echo mkdir -p "$dstdir/$yyyy/$mmdd" ;; esac case x"$action" in xYES) mkdir -p "$dstdir/$yyyy/$mmdd" ;; esac fi # コピーする dest=$p num=000 while [ -f "$dstdir/$yyyy/$mmdd/$dest" ]; do # すでに同名のファイルがあったら… base=`echo $p | sed 's/.[A-Za-z][A-Za-z]*$//'` ext=`echo $p | sed 's/^.*\.\([A-Za-z][A-Za-z]*\)$/\1/'` dest="$base-$num.$ext" num=`echo $num | awk '{printf "%03d\n", 1 + $0}'` done case x"$verbose" in xYES) echo cp -p $p "$dstdir/$yyyy/$mmdd/$dest" ;; esac case x"$action" in xYES) cp -p $p "$dstdir/$yyyy/$mmdd/$dest" chmod -x "$dstdir/$yyyy/$mmdd/$dest" ;; esac case x"$tstamp" in x[0-9]*) case x"$verbose" in xYES) echo touch -t "$tstamp" "$dstdir/$yyyy/$mmdd/$dest" ;; esac case x"$action" in xYES) touch -t "$tstamp" "$dstdir/$yyyy/$mmdd/$dest" ;; esac ;; esac done exit 0 # EOF