こんにちはガチャピン

sasakiですドラえもん

ところで、
シェルスクリプトでn日前に作成されたファイルを
削除するってことが多々あると思います。

ちなみに、シェルスクリプトを勉強するなら、こちらがオススメ。
「林晴比古」さんの本は、新人PGや新人SEにはかなりよい本だと思います。
林 晴比古
新Linux/UNIX入門

話を戻して、
ファイルの作成日で単純にリスト化して、
そのファイルを順番に削除するって方法が一番ラクです。
つまり、「find -ctime -n*日数」ってコマンドを使用します。

 「find -ctime -n*日数」が使える場合
---------------------------------------------------
# n時間(*日数)より前にファイル情報が更新されたファイル名を取得
find $TARGET_DIR -ctime -n*日数 | ls -1 >> $FILE_LIST

# 取得したファイルが全て削除されるまでループ
for FILE_NAME in `cat $FILE_LIST`
do

  # ファイル名が取得できない場合には処理を終了する
  if [ "$FILE_NAME" = "" ]
  then

    # ループ終了
    break

  fi

  # ファイルを削除
  rm $FILE_NAME

done
---------------------------------------------------

ただし、ファイルによってはファイル情報が正しくない場合があります。
この場合、上記の「find -ctime -n*日数」は使えません。

このときは、しょうがないので、自分で「今日からn日前」という計算を
しなければなりません。
もちろん、うるう年計算もしなければなりません。(めんどくせーえ゛!
(ただし、この方法はファイル名にyyyymmddの日付が入っていることが前提となります。)
そうそう、下のシェルを関数化しておくとのちのち楽になりますね。

 「find -ctime -n*日数」が使えない場合
---------------------------------------------------
# シェル起動日を設定
TODAY=`date +%y%m%d` # 本日日付
YEAR=`echo $TODAY | cut -b1-4` # シェル起動年
MONTH=`echo $TODAY | cut -b5-6` # シェル起動月
DAY=`echo $TODAY | cut -b7-8` # シェル起動日
DAYS=n日前の日数(数値) # n日前

# 日付妥当性チェック
if [ $DAY -le 0 -o $DAY -gt 31 -o $MONTH -le 0 -o $MONTH -gt 12 ]
then

  # 異常終了
  exit $FALSE

fi

### 削除対象ファイル日付決定処理 ###
# n日前($DAYS)にシェル起動日からn日前($DAYS)を引いたものを代入
DAYS=`expr $DAY - $DAYS - 1`

# 日付が決定するまでループ
while [ $DAYS -le 0 ]
do
  # 1月である場合
  if [ $MONTH = 1]
  then

    # シェル起動年を1つ前の年にする
    $YEAR=`expr $YEAR -1`

    # シェル起動月12にする
    $MONTH=12

    # シェル起動日を31にする
    $DAY=31

  fi
  # 2月である場合
  elif [ $MONTH = 2 ]
  then

    # うるう年判定変数
    MOD4=`expr $YEAR % 4` # 4で割り切れるかチェック
    MOD100=`expr $YEAR % 100` # 100で割り切れるかチェック
    MOD400=`expr $YEAR % 400` # 400で割り切れるかチェック

    # 月に1を代入
    MONTH=1

    # うるう年チェック
    if [ $MOD4 -eq 0 -o $MOD400 -eq 0 ] && [ $MOD100 -ne 0 ]
    then

      # うるう年の日にち
      DAY=29

    else

      # うるう年の日にちではない
      DAY=28

    fi

  # 4月、6月、9月、11月である場合
  elif [ $MONTH -eq 4 -o $MONTH -eq 6 -o $MONTH -eq 9 $MONTH -eq 11 ]
  then
  
    
    # 月に前月を代入
    MONTH=`expr $MONTH -1`

    # 日に30を代入
    DAY=30

  # 上記以外である場合
  else

    # 月に前月を代入
    MONTH=`expr $MONTH -1`

    # 日に31を代入
    DAY=31
fi

  # 月をどんどん追加
  DAYS=`expr $DAYS + $DAY`

done

# 月を0パディング
MONTH=`echo $MONTH | awk '{printf("%02d"),$1}'`
# 日を0パディング
DAY=`echo $DAYS | awk '{printf("%02d"),$1}'`

# 削除対象ファイル日を取得
TARGET_DATE=`echo $YEAR$MONTH$DAY`

# 指定ディレクトリをリスト化する
ls -1 $TARGET_DIR >> $FILE_LIST

# 取得したファイルが全て削除されるまでループ
for FILE_NAME in `cat $FILE_LIST`
do

  # ファイル名が取得できない場合には処理を終了する
  if [ "$FILE_NAME" = "" ]
  then

    # ループ終了
    break

  fi

  # ファイル名の日付部分を取り出す
  FILE_NAME_DATE=`echo $FILE_NAME | cut ファイル名の日付部分`

  # ファイル名の日付が削除対象ファイル日より小さい場合
  if [ $FILE_NAME_DATE -le $TARGET_DATE ]
  then

    # ファイルを削除
    rm $FILE_NAME
  
  fi

done
---------------------------------------------------