削除ファイルのアーカイブを操作する

#!/bin/sh
#unrm.sh
#指定されたファイルが隠しディレクトリにあるかどうか探す
#該当するファイルが複数見つかった場合には日付の新しい順に
#リスト表示し目的のファイルをユーザーに選択させる

mydir="$HOME/.deleted-files"
realrm="/bin/rm"
move="/bin/mv"

dest=$(pwd)

if [ ! -d $mydir ]; then
    echo "$0: No deleted files directory: nothing to unrm" >&2
    exit 1
fi

cd $mydir

#引数が指定がない時はリスト表示する
if [ $# -eq 0 ]; then
    echo "Contents of your deleted files archive (sorted by date):"
    ls -Fc | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{5\}//g' -e 's/^/   /'
    exit 0
fi

#引数が指定されている場合はパターンとして使い、パターンに
#一致するファイルまたはディレクトリが複数あるか調べる
matches="$(ls *"$1" 2> /dev/null | wc -l)"

if [ $matches -eq 0 ]; then
    echo "No match for \"$1\" in the deleted file archive." >&2
    exit 1
fi

if [ $matches -gt 1 ]; then
    echo "More then file or directory match in the archive:"
    index=1
    #アーカイブ内のファイルを最新のものから順に表示
    #ファイル名に含まれる日付と時刻の情報はawkを使って
    #ファイルが削除された日付と時刻に変換する
    ls -td *"$1" | while read name; do
        datetime="$(echo $name | cut -c1-14 | \
            awk -F. '{ print $5"/"$4" at "$3":"$2":"$1 }')"
        #ディレクトリの場合はディレクトリ内のファイル数を表示
        if [ -d "$name" ]; then
            size="$(ls "$name" | wc -l | sed 's/[^[:digit:]]//g')"
            echo " $index)  $1  (contents = ${size} items, deleted = $(datetime)"
        #ファイルの場合はサイズを表示
        else
            size="$(ls -sdk1 "$name" | awk '{ print $1}')"
            echo " $index)  $1  (size = ${size}Kb, deleted = $datetime)"
        fi
        index=$(( $index + 1))
    done

    echo ""
    echo -n "Which version of $1 do you want to restore ('0' to quit)? [1]: "
    read desired

    if [ ${desired:=1} -gt $matches ]; then
        echo "$0: Restore cancelled by user: index value too big." >&2
        exit 1
    fi

    if [ $desired -lt 1 ]; then
        echo "$0: Restore cancelled by user." >&2
        exit 1
    fi

    #lsの結果のdesired行目を取り出す
    restore="$(ls -td *"$1" | sed -n "${desired}p")"

    if [ -e "$dest/$1" ]; then
        echo "\"$1\" already exists in this derectory. Cannot overwrite." >&2
        exit 1
    fi

    echo -n "Restoring file \"$1\" ..."
    $move "$restore" "$dest/$1"
    echo "done."

    echo -n "Delete the additional copies of this file? [y] "
    read answer

    if [ ${answer:=y} = "y" ]; then
        $realrm -rf *"$1"
        echo "deleted."
    else
        echo "additional copies retained."
    fi
else
    if [ -e "$dest/$1" ]; then
        echo "\"$1\" already exists in this derectory. Cannot overwrite." >&2
        exit 1
    fi

    restore="$(ls -d *"$1")"
    echo -n "Restoring file \"$1\"..."
    $move "$restore" "$dest/$1"
    echo "done."
fi

exit 0
$ ./unrm.sh
Contents of your deleted files archive (sorted by date):
   ragged.txt
   ragged.txt

$ ./unrm.sh ragged.txt
More then file or directory match in the archive:
 1)  ragged.txt  (size = 0Kb, deleted = 12/14 at 15:05:50)
 2)  ragged.txt  (size = 4Kb, deleted = 12/14 at 13:37:30)

Which version of ragged.txt do you want to restore ('0' to quit)? [1]: 0
./unrm.sh: Restore cancelled by user.

$ ./unrm.sh ragged.txt
More then file or directory match in the archive:
 1)  ragged.txt  (size = 0Kb, deleted = 12/14 at 15:05:50)
 2)  ragged.txt  (size = 4Kb, deleted = 12/14 at 13:37:30)

Which version of ragged.txt do you want to restore ('0' to quit)? [1]: 1
50.05.15.14.12.ragged.txt 64
Restoring file "ragged.txt" ...done.
Delete the additional copies of this file? [y] y
deleted.

$ ls
colors.sh  newrm.sh       normdate.sh  valid_date.sh     validint.sh
echon.sh   nfmt.sh        ragged.txt   validalphanum.sh
inpath.sh  nicenumber.sh  unrm.sh      validfloat.sh