ログをバックアップするシェルスクリプトです。
このシェルスクリプトの仕様は、以下のようになります。
仕様
- リストファイルからバックアップ対象を読み込む
- リストファイルのコメント行と空行は読み飛ばす
- バックアップ先のディレクトリーがない場合は、エラーとする
- バックアップ対象は、指定のディレクトリ内のファイルのみとする
- バックアップ対象がない場合は、ワーニングとする
- オプションによって、バックアップのやり方を変えることができる
- バックアップの成功、失敗ごとにメッセージをログに出力する
- 最後にバックアップ数とエラー数をまとめてログに出力する
- ひとつでもエラーがあった場合は、終了ステータスをエラーとする
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#!/bin/bash ### 定数 readonly LIST=backup.lst # バックアップ対象リスト readonly LOG=backup.log # バックアップ結果ログ ### 変数 INF_COUNT=0 # バックアップ成功数 ERR_COUNT=0 # バックアップ失敗数 YMDHMS=$(date +"%Y%m%d%H%M%S") # 現在年月日時分秒 ### リストファイル確認 if [[ ! -r "$LIST" ]] then echo "ERR [$LIST] リストファイルが存在しない" >> $LOG 2>&1 exit 1 fi ### リストファイル読み込み while read target pattern backup option dummy do ### コメントまたは空白の場合は読み飛ばす if [[ "$target" == \#* ]] || [[ -z "$target" ]] then continue fi ### パラメーター不正 if [[ "$pattern" == \#* ]] || [[ -z "$pattern" ]] || \ [[ "$backup" == \#* ]] || [[ -z "$backup" ]] || \ [[ "$option" == \#* ]] || [[ -z "$option" ]] then (( ERR_COUNT++ )) echo "ERR [$target][$pattern][$backup][$option] パラメーター不正" >> $LOG 2>&1 continue fi ### バックアップ先ディレクトリ確認 if [[ ! -d "$backup" ]] then (( ERR_COUNT++ )) echo "ERR [$backup] ディレクトリーなし" >> $LOG 2>&1 continue fi ### バックアップ対象ファイル取得 files=$(ls -1 $target/$pattern 2>/dev/null) ### 該当ファイルチェック if [[ -z "$files" ]] then echo "WAR [$target/$pattern] 該当ファイルなし" >> $LOG 2>&1 continue fi ### オプション毎のコマンドを作成 for buf in $files do case "$option" in c) # コピーのみ cmd_cpy="/bin/cp -p $buf $backup/$(basename $buf).$YMDHMS" cmd_del="" ;; d) # コピー後に削除 cmd_cpy="/bin/cp -p $buf $backup/$(basename $buf).$YMDHMS" cmd_del="/bin/rm -f $buf" ;; *) # オプション不正 (( ERR_COUNT++ )) echo "ERR [$target/$pattern][$option] オプション不正" >> $LOG 2>&1 break ;; esac ### バックアップコマンド実行 $cmd_cpy > /dev/null 2>&1 if (( $? == 0 )) then (( INF_COUNT++ )) echo "INF CPY $buf" >> $LOG 2>&1 ### 削除コマンド確認 if [[ -z "$cmd_del" ]] then continue fi ### 削除コマンド実行 $cmd_del > /dev/null 2>&1 if (( $? == 0 )) then echo "INF DEL $buf" >> $LOG 2>&1 else (( ERR_COUNT++ )) echo "ERR DEL $buf" >> $LOG 2>&1 fi else (( ERR_COUNT++ )) echo "ERR CPY $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 |
メモ
20行目のdummy変数は、リストファイルのoption項目以降の不要な値を格納します。
1 2 3 |
# target pattern backup option /shell/log1 *.log /backup/log1 c /shell/log2 *.log /backup/log2 d |
メモ
option処理は、以下のようになります。
・c ファイル名の後ろに年月日時分秒を付加してコピーする。元ファイルはそのまま。
・d ファイル名の後ろに年月日時分秒を付加してコピーする。元ファイルは削除する。