KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

一定時間経過したログフォルダをアーカイブに移動したい。

登録日 :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 に記録されます