こんにちは
sasakiです
ところで、
シェルスクリプトでn日前に作成されたファイルを
削除するってことが多々あると思います。
ちなみに、シェルスクリプトを勉強するなら、こちらがオススメ。
「林晴比古」さんの本は、新人PGや新人SEにはかなりよい本だと思います。
話を戻して、
ファイルの作成日で単純にリスト化して、
そのファイルを順番に削除するって方法が一番ラクです。
つまり、「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
---------------------------------------------------
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
---------------------------------------------------