#!/bin/sh
TMP_DIR='/dev/shm'
RM='/bin/rm'
### このシェルは一時ファイルを作成します。
### (0バイトのファイルを最大2ファイル。)
### スクリプト内で一時ファイルは削除していますが、
### トラップ不可能なシグナルでの強制終了も考慮し、
### 一時ファイルはtmpfs(/dev/shm。OS再起動で消滅するRAMディスク)に作成します。
tmp_file_from=${TMP_DIR}'/lu_from'`date +'%Y%m%d%H%M%S'`'-'$$'.tmp'
tmp_file_to=${TMP_DIR}'/lu_to'`date +'%Y%m%d%H%M%S'`'-'$$'.tmp'
err_msg=''
from_time=''
to_time=''
function exit_proc(){
	if [ -f ${tmp_file_from} ] ; then
		${RM} ${tmp_file_from}
	fi
	if [ -f ${tmp_file_to} ] ; then
		${RM} ${tmp_file_to}
	fi
	if [ "${err_msg}" ] ; then
		echo ${err_msg} >&2
	fi
	exit $1
}
trap "exit_proc 101" 1 2 3 15
function chk_param(){
	### dateコマンドによる日時チェックは動作が不安定なため
	###   1.数字だけであること
	###   2.桁数が8または12であること
	###   3.先頭8桁がYYYYMMDDであること
	###   4.桁数が12の場合、後4桁がHHMMであること
	### としてチェックする
	### date +'%Y%m%d%H%M' -d 201205202359 ==> なぜかエラーになる。(日付と時刻の同時チェックが行えない？)

	# 数字だけであること
	chk_str=`echo $1|grep -e '^[0-9]*$'`
	if [ -z ${chk_str} ] || [ $1 -ne ${chk_str} ] ; then
		return 111
	fi
	# 桁数が4または8または12であること
	case ${#1} in
		4)
			chk_str=`date +'%Y'`$1
			;;
		8|12)
			chk_str=$1
			;;
		*)
			return 112
	esac
	# 先頭8桁がYYYYMMDDであること
	date +'%Y%m%d' -d ${chk_str:0:8} > /dev/null 2>&1
	if [ $? -ne 0 ] ; then
		return 113
	fi
	if [ ${#chk_str} -eq 12 ] ; then
		# 桁数が12の場合、後4桁がHHMMであること
		date +'%H%M' -d ${chk_str:8:4} > /dev/null 2>&1
		if [ $? -ne 0 ] ; then
			return 114
		fi
		if [ $2 -eq 1 ] ; then
			# HHMM指定時のFROM秒
			from_time=${chk_str}'.00'
		else
			# HHMM指定時のTO秒
			to_time=${chk_str}'.59'
		fi
	else
		if [ $2 -eq 1 ] ; then
			# HHMM未指定時のFROM時刻
			from_time=${chk_str}'0000.00'
		else
			# HHMM未指定時のTO時刻
			to_time=${chk_str}'2359.59'
		fi
	fi
	return 0
}
case $# in
	0)
		from_time=`date +'%Y%m%d'`'0000.00'
		;;
	1)
		chk_param $1 1
		ret=$?
		if [ ${ret} -ne 0 ] ; then
			err_msg='invalid 1st param(valid format is MMDD or YYYYMMDD or YYYYMMDDhhmm)'
			exit_proc ${ret}
		fi
		;;
	2)
		chk_param $1 1
		ret=$?
		if [ ${ret} -eq 0 ] ; then
			chk_param $2 2
			ret=$?
			if [ ${ret} -ne 0 ] ; then
				err_msg='invalid 2nd param(valid format is MMDD or YYYYMMDD or YYYYMMDDhhmm)'
				exit_proc ${ret}
			fi
		else
			err_msg='invalid 1st param(valid format is MMDD or YYYYMMDD or YYYYMMDDhhmm)'
			exit_proc ${ret}
		fi
		;;
	*)
		err_msg='usage lu [from_date|from_date_time] [[to_date|to_date_time]]'
		exit_proc 121
esac
if [ $# -ne 0 ] ; then
	typeset -i from_time_num=${from_time:0:12}
	typeset -i current_time_num=`date +'%Y%m%d%H%M'`
	if [ ${from_time_num} -gt ${current_time_num} ] ; then
		err_msg='from_date_time must littele than current_date_time'
		exit_proc 131
	fi
	if [ $# -eq 2 ] ; then
		typeset -i to_time_num=${to_time:0:12}
		if [ ${from_time_num} -gt ${to_time_num} ] ; then
			err_msg='from_date_time must littele than to_date_time'
			exit_proc 132
		fi
		if [ ${to_time_num} -gt ${current_time_num} ] ; then
			err_msg='to_date_time must littele than current_date_time'
			exit_proc 133
		fi
	fi
fi
touch -m -t ${from_time} ${tmp_file_from}
if [ $? -ne 0 ] ; then
	err_msg='### other error(tmp_file_from make error) ###'
	exit_proc 141
fi

if [ $# -eq 2 ] ; then
	touch -m -t ${to_time} ${tmp_file_to}
	if [ $? -ne 0 ] ; then
		err_msg='### other error(tmp_file_to make error) ###'
		exit_proc 142
	fi
	find . -type f -newer ${tmp_file_from} -not -newer ${tmp_file_to}
else
	find . -type f -newer ${tmp_file_from}
fi
exit_proc $?
