読者です 読者をやめる 読者になる 読者になる

指定日時よりも更新日付の新しいファイルを検索するシェルスクリプト


タイトルの通りです。

#!/bin/sh
#
# 名称
#    find_new_file.sh - 指定日時よりも更新日付の新しいファイルを表示する。
#
# 書式
#    find_new_file.sh [-rv] [[CC]YY]MMDDhhmm[.ss] [directory]
#
# 解説
#    指定日時より更新日付の新しいファイルを表示します。
#    ディレクトリ指定が無い場合はカレントディレクトリ下を検索します。
#
#      ex)
#        find_new_file.sh 200611200000 ./tmp
#        ./tmp下から更新日付が2005/11/20 00時00分より新しいファイルを表示
#
#    -r リバースモード 指定日時より更新日付の古いファイルを表示
#
#    -v 冗長モード ファイルの詳細情報を表示
#
# 戻り値
#    0    正常終了
#    1    指定したファイルが存在しない場合
#
###############################################################################
CMDNAME=`basename $0`
USAGE="Usage: $CMDNAME [-rv] [[CC]YY]MMDDhhmm[.SS] [directory]"

TMP_FILE=/tmp/basetmp.$$
BASE_DIR=
V=FALSE
R=FALSE

IsNewer() {
    # 名称
    #    IsNewer - 2つのファイルの日付を比較する
    #
    # 書式
    #    IsNewer file1 file2
    #
    # 解説
    #    file2の更新日付よりfile1の更新日付が新しい場合真(0)を返却する。
    #    そうでない場合には偽(1)を返却する。
    #
    if [ $# -ne 2 ]; then
        echo "Usage: IsNewer file1 file2" 1>&2
        exit 1
    fi

    if [ ! -f $1 -o ! -f $2 ]; then
        return 1
    fi

    if [ -n "`find $1 -newer $2 -print`" ]; then
        return 0
    else
        return 1
    fi
}


trap `rm -f /tmp/*.$$; exit 1` 1 2 3 15

#
# オプション処理
#
if [ "$OPTIND" = 1 ]; then
    while getopts rv OPT
    do
        case $OPT in
            r)   R=TRUE
                 ;;
            v)   V=TRUE
                 ;;
            \?)  echo "$USAGE" 1>&2
                 exit 1
                 ;;
        esac
    done
    shift `expr $OPTIND - 1`
else
    USAGE="Usage: $CMDNAME [-r] [-v] [[CC]YY]MMDDhhmm[.SS] [directory]"
    while :
    do
        case $1 in
            -r)  R=TRUE
                 shift
                 ;;
            -v)  V=TRUE
                 shift
                 ;;
            --)  shift
                 break
                 ;;
            -*)  echo "$USAGE" 1>&2
                 exit 1
                 ;;
            *)   break
                 ;;
        esac
    done
fi


#
# コマンド引数チェック
#
if [ $# -eq 1 ]; then
    BASE_DIR="."
elif [ $# -eq 2 ]; then
    BASE_DIR="$2"
else
    echo "$USAGE" 1>&2
    exit 1
fi


#
# 比較用一時ファイルの作成
#
touch -t "$1" $TMP_FILE


#
# 検索処理
#
for f in `find $BASE_DIR \( -type f -o -type l \) -print`
do
    FILE1="$f"
    FILE2="$TMP_FILE"
    if [ "$R" = "TRUE" ]; then
        FILE1="$TMP_FILE"
        FILE2="$f"
    fi

    if IsNewer $FILE1 $FILE2; then
        f=`echo "$f" | sed -e 's%^\./%%'`
        if [ "$V" = "TRUE" ]; then
            ls -al "$f"
        else
            echo "$f"
        fi
    fi
done


#
# 一時ファイルの削除
#
rm -f /tmp/*.$$

exit 0