一定時間経過したログフォルダをアーカイブに移動したい。
| 登録日 | :2025/03/30 19:10 |
|---|---|
| カテゴリ | :Linux |
一定期間経過したログファイル(フォルダ毎)をアーカイブに移動するスクリプト
#!/bin/bash
SOURCE_DIR="/home/settings/Epilog/log"
ARCHIVE_DIR="/home/settings/Epilog/log/archive"
DAYS=14
# Log file settings
LOG_FILE="/home/settings/Epilog/log/archive/log_file.log"
# Execution start log
echo "$(date): Starting archive script" >> "$LOG_FILE"
# Directory existence check
if [[ ! -d "$SOURCE_DIR" || ! -d "$ARCHIVE_DIR" ]]; then
echo "$(date): Error - SOURCE_DIR or ARCHIVE_DIR does not exist" >> "$LOG_FILE"
exit 1
fi
# Move the old folder
find "$SOURCE_DIR" -maxdepth 1 -type d -mtime +$DAYS ! -name "$(basename "$SOURCE_DIR")" -exec mv {} "$ARCHIVE_DIR" \; >> "$LOG_FILE" 2>&1
# Execution end log
echo "$(date): Archive script completed successfully" >> "$LOG_FILE"
動作確認
[root@compute01 log]# ls
100 102 104 106 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 move_archive.sh
101 103 105 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 archive move_archive_cron.sh
[root@compute01 log]#
[root@compute01 log]# ll
合計 0
drwxr-xr-x. 2 root root 54 3月 30 08:11 100
drwxr-xr-x. 2 root root 54 3月 30 08:15 101
drwxr-xr-x. 2 root root 54 3月 30 08:17 102
drwxr-xr-x. 2 root root 54 3月 30 08:23 103
drwxr-xr-x. 2 root root 54 3月 30 09:10 104
drwxr-xr-x. 2 root root 54 3月 30 09:14 105
drwxr-xr-x. 2 root root 54 3月 30 12:42 106
drwxr-xr-x. 2 root root 43 3月 15 07:47 62
drwxr-xr-x. 2 root root 100 3月 15 07:44 63
drwxr-xr-x. 2 root root 100 3月 15 07:52 64
drwxr-xr-x. 2 root root 100 3月 15 07:54 65
drwxr-xr-x. 2 root root 100 3月 15 08:00 66
drwxr-xr-x. 2 root root 100 3月 15 08:07 67
drwxr-xr-x. 2 root root 53 3月 15 08:20 68
drwxr-xr-x. 2 root root 53 3月 15 16:05 69
drwxr-xr-x. 2 root root 100 3月 15 16:08 70
drwxr-xr-x. 2 root root 100 3月 15 16:33 71
drwxr-xr-x. 2 root root 53 3月 15 17:22 72
drwxr-xr-x. 2 root root 53 3月 20 20:58 73
drwxr-xr-x. 2 root root 53 3月 20 21:00 74
drwxr-xr-x. 2 root root 53 3月 20 21:04 75
drwxr-xr-x. 2 root root 53 3月 20 21:21 76
drwxr-xr-x. 2 root root 53 3月 20 21:23 77
drwxr-xr-x. 2 root root 53 3月 20 21:27 78
drwxr-xr-x. 2 root root 53 3月 20 21:31 79
drwxr-xr-x. 2 root root 53 3月 20 21:38 80
drwxr-xr-x. 2 root root 53 3月 20 21:39 81
drwxr-xr-x. 2 root root 53 3月 29 20:24 82
drwxr-xr-x. 2 root root 53 3月 29 21:11 83
drwxr-xr-x. 2 root root 53 3月 29 21:14 84
drwxr-xr-x. 2 root root 53 3月 29 21:15 85
drwxr-xr-x. 2 root root 53 3月 29 21:16 86
drwxr-xr-x. 2 root root 53 3月 29 21:18 87
drwxr-xr-x. 2 root root 53 3月 29 21:20 88
drwxr-xr-x. 2 root root 53 3月 29 21:26 89
drwxr-xr-x. 2 root root 53 3月 30 07:14 90
drwxr-xr-x. 2 root root 53 3月 30 07:14 91
drwxr-xr-x. 2 root root 53 3月 30 07:41 92
drwxr-xr-x. 2 root root 53 3月 30 07:54 93
drwxr-xr-x. 2 root root 53 3月 30 07:57 94
drwxr-xr-x. 2 root root 53 3月 30 08:00 95
drwxr-xr-x. 2 root root 53 3月 30 08:07 96
drwxr-xr-x. 2 root root 53 3月 30 08:07 97
drwxr-xr-x. 2 root root 53 3月 30 08:08 98
drwxr-xr-x. 2 root root 53 3月 30 08:09 99
[root@compute01 log]#
#スクリプトを実行する
[root@compute01 log]# ./move_archive_cron.sh
[root@compute01 log]# ls
100 102 104 106 74 76 78 80 82 84 86 88 90 92 94 96 98 archive move_archive_cron.sh
101 103 105 73 75 77 79 81 83 85 87 89 91 93 95 97 99 move_archive.sh
[root@compute01 log]#
[root@compute01 log]# ll
合計 12
drwxr-xr-x. 2 root root 54 3月 30 08:11 100
drwxr-xr-x. 2 root root 54 3月 30 08:15 101
drwxr-xr-x. 2 root root 54 3月 30 08:17 102
drwxr-xr-x. 2 root root 54 3月 30 08:23 103
drwxr-xr-x. 2 root root 54 3月 30 09:10 104
drwxr-xr-x. 2 root root 54 3月 30 09:14 105
drwxr-xr-x. 2 root root 54 3月 30 12:42 106
drwxr-xr-x. 2 root root 53 3月 20 20:58 73
drwxr-xr-x. 2 root root 53 3月 20 21:00 74
drwxr-xr-x. 2 root root 53 3月 20 21:04 75
drwxr-xr-x. 2 root root 53 3月 20 21:21 76
drwxr-xr-x. 2 root root 53 3月 20 21:23 77
drwxr-xr-x. 2 root root 53 3月 20 21:27 78
drwxr-xr-x. 2 root root 53 3月 20 21:31 79
drwxr-xr-x. 2 root root 53 3月 20 21:38 80
drwxr-xr-x. 2 root root 53 3月 20 21:39 81
drwxr-xr-x. 2 root root 53 3月 29 20:24 82
drwxr-xr-x. 2 root root 53 3月 29 21:11 83
drwxr-xr-x. 2 root root 53 3月 29 21:14 84
drwxr-xr-x. 2 root root 53 3月 29 21:15 85
drwxr-xr-x. 2 root root 53 3月 29 21:16 86
drwxr-xr-x. 2 root root 53 3月 29 21:18 87
drwxr-xr-x. 2 root root 53 3月 29 21:20 88
drwxr-xr-x. 2 root root 53 3月 29 21:26 89
drwxr-xr-x. 2 root root 53 3月 30 07:14 90
drwxr-xr-x. 2 root root 53 3月 30 07:14 91
drwxr-xr-x. 2 root root 53 3月 30 07:41 92
drwxr-xr-x. 2 root root 53 3月 30 07:54 93
drwxr-xr-x. 2 root root 53 3月 30 07:57 94
drwxr-xr-x. 2 root root 53 3月 30 08:00 95
drwxr-xr-x. 2 root root 53 3月 30 08:07 96
drwxr-xr-x. 2 root root 53 3月 30 08:07 97
drwxr-xr-x. 2 root root 53 3月 30 08:08 98
drwxr-xr-x. 2 root root 53 3月 30 08:09 99
drwxr-xr-x. 13 root root 136 3月 30 18:54 archive
-rwxr-xr-x. 1 root root 962 3月 30 18:47 move_archive.sh
-rwxr-xr-x. 1 root root 702 3月 30 19:06 move_archive_cron.sh
-rwxr-xr-x. 1 root root 909 3月 30 18:53 move_archive_cron.sh.bk01
[root@compute01 log]#
#アーカイブフォルダを確認する
[root@compute01 log]# ls archive/
62 63 64 65 66 67 68 69 70 71 72 log_file.log
[root@compute01 log]#
[root@compute01 log]# ll archive/
合計 4
drwxr-xr-x. 2 root root 43 3月 15 07:47 62
drwxr-xr-x. 2 root root 100 3月 15 07:44 63
drwxr-xr-x. 2 root root 100 3月 15 07:52 64
drwxr-xr-x. 2 root root 100 3月 15 07:54 65
drwxr-xr-x. 2 root root 100 3月 15 08:00 66
drwxr-xr-x. 2 root root 100 3月 15 08:07 67
drwxr-xr-x. 2 root root 53 3月 15 08:20 68
drwxr-xr-x. 2 root root 53 3月 15 16:05 69
drwxr-xr-x. 2 root root 100 3月 15 16:08 70
drwxr-xr-x. 2 root root 100 3月 15 16:33 71
drwxr-xr-x. 2 root root 53 3月 15 17:22 72
-rw-r--r--. 1 root root 150 3月 30 18:54 log_file.log
[root@compute01 log]#
スクリプトのポイント
- 厳密な対象選択:
find "$SOURCE_DIR" -maxdepth 1 -type d -mtime +$DAYS ! -name "$(basename "$SOURCE_DIR")"
-maxdepth 1: 直下のディレクトリのみ対象
・-type d: ディレクトリのみ選択
・-mtime +30: 30日以上前の変更日時
・! -name ...: ルートディレクトリ自身を除外
- ログ構造維持:
移動元ディレクトリ構造をそのまま保持
例: ID123 → archive/ID123
詳細
以下のコマンドの意味を詳細に説明します。
find "$SOURCE_DIR" -maxdepth 1 -type d -mtime +$DAYS ! -name "$(basename "$SOURCE_DIR")" -exec mv {} "$ARCHIVE_DIR" \; >> "$LOG_FILE" 2>&1
コマンドの構造と意味
- 1. find "$SOURCE_DIR"
意味: 指定されたディレクトリ 「$SOURCE_DIR」 内で検索を開始します。
「$SOURCE_DIR」 は検索対象のルートディレクトリです。
- 2. -maxdepth 1
意味: 検索の深さを制限します。
1 は、指定されたディレクトリ 「$SOURCE_DIR」 の直下のみを検索対象とし、サブディレクトリ内は検索しません。
- 3. -type d
意味: ディレクトリのみを検索対象とします。
ファイルやその他のタイプ(例: シンボリックリンク)は除外されます。
- 4. -mtime +$DAYS
意味: 最終更新日時が $DAYS 日以上前のディレクトリを検索します。
「$DAYS」 は変数で、例えば 30 を指定すると、30日以上前に変更されたディレクトリが対象になります。
- 5. ! -name "$(basename "$SOURCE_DIR")"
意味: $SOURCE_DIR 自身(ルートディレクトリ)を検索結果から除外します。
"$(basename "$SOURCE_DIR")" は $SOURCE_DIR の末尾(ディレクトリ名)を取得します。
! は否定条件で、「名前が $SOURCE_DIR のディレクトリは含めない」という意味です。
- 6. -exec mv {} "$ARCHIVE_DIR" \;
意味: 条件に一致した各ディレクトリを $ARCHIVE_DIR に移動します。
{} は、条件に一致したファイルやディレクトリのパスを指します。
mv は移動コマンドで、"$ARCHIVE_DIR" にディレクトリを移動します。
\; は find コマンド内で -exec を終了するための記号です。
- 7. >> "$LOG_FILE" 2>&1
意味: 標準出力と標準エラー出力をログファイル ($LOG_FILE) に記録します。
「>>」: 出力内容を追記モードでログファイルに書き込みます。
「2>&1」: 標準エラー出力(エラー内容)を標準出力に統合し、ログファイルに記録します。
全体の動作
このコマンドは以下の処理を行います:
「$SOURCE_DIR」 の直下で、30日以上前に更新されたディレクトリを検索します(サブディレクトリは無視)。
検索結果から 「$SOURCE_DIR」 自身を除外します。
条件に一致した各ディレクトリを $ARCHIVE_DIR に移動します。
実行結果やエラー内容はすべて $LOG_FILE に記録されます。