ログを削除するシェルスクリプトです。
このシェルスクリプトの仕様は、以下のようになります。
仕様
- リストファイルから削除対象を読み込む
- リストファイルのコメント行と空行は読み飛ばす
- 削除対象は、指定のディレクトリ内のファイルのみとする
- 削除対象は、更新日がdays項目の日数以前のファイルとする
- 削除対象がない場合は、ワーニングとする
- 削除の成功、失敗ごとにメッセージをログに出力する
- 最後に削除数とエラー数をまとめてログに出力する
- ひとつでもエラーがあった場合は、終了ステータスをエラーとする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#!/bin/bash ### 定数 readonly LIST=delete.lst # 削除対象リスト readonly LOG=delete.log # 削除結果ログ ### 変数 INF_COUNT=0 # 削除成功数 ERR_COUNT=0 # 削除失敗数 ### リストファイル確認 if [[ ! -r "$LIST" ]] then echo "ERR [$LIST] リストファイルが存在しない" >> $LOG 2>&1 exit 1 fi ### リストファイル読み込み while read target pattern days dummy do ### コメントまたは空白の場合は読み飛ばす if [[ "$target" == \#* ]] || [[ -z "$target" ]] then continue fi ### パラメーター不正 if [[ "$pattern" == \#* ]] || [[ -z "$pattern" ]] || \ [[ "$days" == \#* ]] || [[ -z "$days" ]] then (( ERR_COUNT++ )) echo "ERR [$target][$pattern][$days] パラメーター不正" >> $LOG 2>&1 continue fi ### 削除対象ファイル取得 files=$(find $target -maxdepth 1 -name "$pattern" -mtime +$days -type f 2>/dev/null) ### 該当ファイルチェック if [[ -z "$files" ]] then echo "WAR [$target/$pattern] 該当ファイルなし" >> $LOG 2>&1 continue fi ### 削除処理 for buf in $files do cmd_del="/bin/rm -f $buf" ### 削除コマンド実行 $cmd_del > /dev/null 2>&1 if (( $? == 0 )) then (( INF_COUNT++ )) echo "INF DEL $buf" >> $LOG 2>&1 else (( ERR_COUNT++ )) echo "ERR DEL $buf" >> $LOG 2>&1 fi done done < "$LIST" ### 総合エラーチェック echo "INF 削除数=[$INF_COUNT] 削除エラー数=[$ERR_COUNT]" >> $LOG 2>&1 ### 終了処理 if (( ERR_COUNT == 0 )) then exit 0 else exit 1 fi |
メモ
19行目のdummy変数は、リストファイルのdays項目以降の不要な値を格納します。
1 2 3 |
# target pattern days /backup/log1 *.log.* 30 /backup/log2 *.log.* 30 |