最新のファイル(日付の降順でソート済)から10世代だけ保持するプログラム

2022年2月5日

概要
今回は, ShellScript( Bash ) で, 配列を用いたプログラムを試していきます。
C Like な, for 文で配列をゴニョゴニョしますよ♪楽しいですね( ● ´ ー ` ● )

例に示すプログラムは, 所謂世間一般的に言われるログローテートを行うもの
になります。
ShellScript の配列ゴニョゴニョするの癖があって難しいp(´⌒`q
それでは, 実際にプログラムを見ていきましょう♪


最新のファイル(日付の降順でソート済)から10世代だけ保持するプログラム

#!/usr/bin/env bash
# Debug 表示切り替えようフラグ true で Debug 表示, false で, ファイル削除が走る
isDebug=true
# 保持するファイル数
leaveFilesKeep=10
# 保持しようと思っているディレクトリを指定
searchPath=/var/log/sa
# この配列に日付の降順でファイルパス + ファイル名の形で格納される
# ls コマンドのバージョンによって出力結果が異なるようなので注意して下さい
# $9 の部分を適宜書き換えれば良いかと思われます
array=(ls -ltd $searchPath/* | grep -v "合計" | awk '{ print $9 }')
arraySize=${#array[@]}

if [ $arraySize -gt $leaveFilesKeep ]; then
    # 配列の大きさ - 保持するファイル数 = 削除するファイル
    for((i = 0; i < $arraySize - $leaveFilesKeep; i++)); do
        if [ $isDebug == true ]; then
            if [ $i == 0 ]; then
                echo "Debug 表示の状態です。"

            fi
            echo ${array[$(( i + leaveFilesKeep ))]}

        else
            # 削除する配列番目から保持するファイル数を足す事によって保持したいファイル数だけ
            # 残すことができる
            # うまく理解出来ない方は, 実際に動かして戯れるのをお勧め致します
            # 多分, 感覚的に理解出来るようになってくると思いますよ♪
            rm -rf ${array[$(( i + leaveFilesKeep ))]}

        fi

    done

fi

最新ファイルの保持する前のディレクトリにファイル一覧
ディレクトリ内のファイルは, 日付の降順で表示している

[root@raspi3b_plus ~]# ls -ltd /var/log/sa/*
/*===============================================================*/
-rw-r--r-- 1 root root  532108  1月 29 02:27 /var/log/sa/sa29
-rw-r--r-- 1 root root 5198008  1月 28 23:59 /var/log/sa/sa28
-rw-r--r-- 1 root root 3308338  1月 28 23:53 /var/log/sa/sar28
-rw-r--r-- 1 root root 5185928  1月 27 23:59 /var/log/sa/sa27
-rw-r--r-- 1 root root 3315070  1月 27 23:53 /var/log/sa/sar27
-rw-r--r-- 1 root root 5191968  1月 26 23:59 /var/log/sa/sa26
-rw-r--r-- 1 root root 3317418  1月 26 23:53 /var/log/sa/sar26
-rw-r--r-- 1 root root 5182908  1月 25 23:59 /var/log/sa/sa25
-rw-r--r-- 1 root root 3315058  1月 25 23:53 /var/log/sa/sar25
-rw-r--r-- 1 root root 5191968  1月 24 23:59 /var/log/sa/sa24
-rw-r--r-- 1 root root 3310573  1月 24 23:53 /var/log/sa/sar24
-rw-r--r-- 1 root root 5191968  1月 23 23:59 /var/log/sa/sa23
-rw-r--r-- 1 root root 3315117  1月 23 23:53 /var/log/sa/sar23
-rw-r--r-- 1 root root 5191968  1月 22 23:59 /var/log/sa/sa22
-rw-r--r-- 1 root root 3315156  1月 22 23:53 /var/log/sa/sar22
-rw-r--r-- 1 root root 5201028  1月 21 23:59 /var/log/sa/sa21
-rw-r--r-- 1 root root 3312860  1月 21 23:53 /var/log/sa/sar21
-rw-r--r-- 1 root root 5185928  1月 20 23:59 /var/log/sa/sa20
-rw-r--r-- 1 root root 3306018  1月 20 23:53 /var/log/sa/sar20
-rw-r--r-- 1 root root 5188948  1月 19 23:59 /var/log/sa/sa19
-rw-r--r-- 1 root root 3310528  1月 19 23:53 /var/log/sa/sar19
-rw-r--r-- 1 root root 5185928  1月 18 23:59 /var/log/sa/sa18
-rw-r--r-- 1 root root 3310626  1月 18 23:53 /var/log/sa/sar18
-rw-r--r-- 1 root root 5204048  1月 17 23:59 /var/log/sa/sa17
-rw-r--r-- 1 root root 3308306  1月 17 23:53 /var/log/sa/sar17
-rw-r--r-- 1 root root 5179888  1月 16 23:59 /var/log/sa/sa16
-rw-r--r-- 1 root root 3310498  1月 16 23:53 /var/log/sa/sar16
-rw-r--r-- 1 root root 5191968  1月 15 23:59 /var/log/sa/sa15
-rw-r--r-- 1 root root 3312848  1月 15 23:53 /var/log/sa/sar15
-rw-r--r-- 1 root root 5191968  1月 14 23:59 /var/log/sa/sa14
-rw-r--r-- 1 root root 3306028  1月 14 23:53 /var/log/sa/sar14
-rw-r--r-- 1 root root 5198008  1月 13 23:59 /var/log/sa/sa13
-rw-r--r-- 1 root root 3310618  1月 13 23:53 /var/log/sa/sar13
-rw-r--r-- 1 root root 5198008  1月 12 23:59 /var/log/sa/sa12
-rw-r--r-- 1 root root 3308278  1月 12 23:53 /var/log/sa/sar12
-rw-r--r-- 1 root root 5201028  1月 11 23:59 /var/log/sa/sa11
-rw-r--r-- 1 root root 3310616  1月 11 23:53 /var/log/sa/sar11
-rw-r--r-- 1 root root 5204048  1月 10 23:59 /var/log/sa/sa10
-rw-r--r-- 1 root root 3310558  1月 10 23:53 /var/log/sa/sar10
-rw-r--r-- 1 root root 5191968  1月  9 23:59 /var/log/sa/sa09
-rw-r--r-- 1 root root 3312768  1月  9 23:53 /var/log/sa/sar09
-rw-r--r-- 1 root root 5191968  1月  8 23:59 /var/log/sa/sa08
-rw-r--r-- 1 root root 3308278  1月  8 23:53 /var/log/sa/sar08
-rw-r--r-- 1 root root 5207068  1月  7 23:59 /var/log/sa/sa07
-rw-r--r-- 1 root root 3308313  1月  7 23:53 /var/log/sa/sar07
-rw-r--r-- 1 root root 5185928  1月  6 23:59 /var/log/sa/sa06
-rw-r--r-- 1 root root 3310549  1月  6 23:53 /var/log/sa/sar06
-rw-r--r-- 1 root root 5198008  1月  5 23:59 /var/log/sa/sa05
-rw-r--r-- 1 root root 3310568  1月  5 23:53 /var/log/sa/sar05
-rw-r--r-- 1 root root 5198008  1月  4 23:59 /var/log/sa/sa04
-rw-r--r-- 1 root root 3306018  1月  4 23:53 /var/log/sa/sar04
-rw-r--r-- 1 root root 5188948  1月  3 23:59 /var/log/sa/sa03
-rw-r--r-- 1 root root 3308288  1月  3 23:53 /var/log/sa/sar03
-rw-r--r-- 1 root root 5194988  1月  2 23:59 /var/log/sa/sa02
-rw-r--r-- 1 root root 3310624  1月  2 23:53 /var/log/sa/sar02
-rw-r--r-- 1 root root 3308308  1月  1 23:53 /var/log/sa/sar01
-rw-r--r-- 1 root root 5201028 12月 31 23:59 /var/log/sa/sa31
-rw-r--r-- 1 root root 3308328 12月 31 23:53 /var/log/sa/sar31
-rw-r--r-- 1 root root 5185928 12月 30 23:59 /var/log/sa/sa30
-rw-r--r-- 1 root root 3306008 12月 30 23:53 /var/log/sa/sar30
/*===============================================================*/

冒頭で示したコードを実行すると最終的にディレクトリ内の中身は以下のようになる

[root@raspi3b_plus ~]# ls -ltd /var/log/sa/*
/*===============================================================*/
-rw-r--r-- 1 root root  532108  1月 29 02:27 /var/log/sa/sa29
-rw-r--r-- 1 root root 5198008  1月 28 23:59 /var/log/sa/sa28
-rw-r--r-- 1 root root 3308338  1月 28 23:53 /var/log/sa/sar28
-rw-r--r-- 1 root root 5185928  1月 27 23:59 /var/log/sa/sa27
-rw-r--r-- 1 root root 3315070  1月 27 23:53 /var/log/sa/sar27
-rw-r--r-- 1 root root 5191968  1月 26 23:59 /var/log/sa/sa26
-rw-r--r-- 1 root root 3317418  1月 26 23:53 /var/log/sa/sar26
-rw-r--r-- 1 root root 5182908  1月 25 23:59 /var/log/sa/sa25
-rw-r--r-- 1 root root 3315058  1月 25 23:53 /var/log/sa/sar25
-rw-r--r-- 1 root root 5191968  1月 24 23:59 /var/log/sa/sa24
/*===============================================================*/

デバック表示の状態で実行すると以下のようになる
isDebugtrue or false にすることによって切り替えられる
true 状態にすると実際にファイル削除されるので, Debug 状態で確認することをお勧め致します。

[root@raspi3b_plus ~]# ./Array.sh
Debug 表示の状態です。
/var/log/sa/sar24
/var/log/sa/sa23
/var/log/sa/sar23
/var/log/sa/sa22
/var/log/sa/sar22
/var/log/sa/sa21
/var/log/sa/sar21
/var/log/sa/sa20
/var/log/sa/sar20
/var/log/sa/sa19
/var/log/sa/sar19
/var/log/sa/sa18
/var/log/sa/sar18
/var/log/sa/sa17
/var/log/sa/sar17
/var/log/sa/sa16
/var/log/sa/sar16
/var/log/sa/sa15
/var/log/sa/sar15
/var/log/sa/sa14
/var/log/sa/sar14
/var/log/sa/sa13
/var/log/sa/sar13
/var/log/sa/sa12
/var/log/sa/sar12
/var/log/sa/sa11
/var/log/sa/sar11
/var/log/sa/sa10
/var/log/sa/sar10
/var/log/sa/sa09
/var/log/sa/sar09
/var/log/sa/sa08
/var/log/sa/sar08
/var/log/sa/sa07
/var/log/sa/sar07
/var/log/sa/sa06
/var/log/sa/sar06
/var/log/sa/sa05
/var/log/sa/sar05
/var/log/sa/sa04
/var/log/sa/sar04
/var/log/sa/sa03
/var/log/sa/sar03
/var/log/sa/sa02
/var/log/sa/sar02
/var/log/sa/sar01
/var/log/sa/sa31
/var/log/sa/sar31
/var/log/sa/sa30
/var/log/sa/sar30

保持されるファイル一覧【例】

-rw-r–r– 1 root root 532108 1月 29 02:27 /var/log/sa/sa29
-rw-r–r– 1 root root 5198008 1月 28 23:59 /var/log/sa/sa28
-rw-r–r– 1 root root 3308338 1月 28 23:53 /var/log/sa/sar28
-rw-r–r– 1 root root 5185928 1月 27 23:59 /var/log/sa/sa27
-rw-r–r– 1 root root 3315070 1月 27 23:53 /var/log/sa/sar27
-rw-r–r– 1 root root 5191968 1月 26 23:59 /var/log/sa/sa26
-rw-r–r– 1 root root 3317418 1月 26 23:53 /var/log/sa/sar26
-rw-r–r– 1 root root 5182908 1月 25 23:59 /var/log/sa/sa25
-rw-r–r– 1 root root 3315058 1月 25 23:53 /var/log/sa/sar25
-rw-r–r– 1 root root 5191968 1月 24 23:59 /var/log/sa/sa24

削除されるファイル一覧【例】Debug モードでは削除しません

-rw-r–r– 1 root root 3310573 1月 24 23:53 /var/log/sa/sar24
-rw-r–r– 1 root root 5191968 1月 23 23:59 /var/log/sa/sa23
-rw-r–r– 1 root root 3315117 1月 23 23:53 /var/log/sa/sar23
-rw-r–r– 1 root root 5191968 1月 22 23:59 /var/log/sa/sa22
-rw-r–r– 1 root root 3315156 1月 22 23:53 /var/log/sa/sar22
-rw-r–r– 1 root root 5201028 1月 21 23:59 /var/log/sa/sa21
-rw-r–r– 1 root root 3312860 1月 21 23:53 /var/log/sa/sar21
-rw-r–r– 1 root root 5185928 1月 20 23:59 /var/log/sa/sa20
-rw-r–r– 1 root root 3306018 1月 20 23:53 /var/log/sa/sar20
-rw-r–r– 1 root root 5188948 1月 19 23:59 /var/log/sa/sa19
-rw-r–r– 1 root root 3310528 1月 19 23:53 /var/log/sa/sar19
-rw-r–r– 1 root root 5185928 1月 18 23:59 /var/log/sa/sa18
-rw-r–r– 1 root root 3310626 1月 18 23:53 /var/log/sa/sar18
-rw-r–r– 1 root root 5204048 1月 17 23:59 /var/log/sa/sa17
-rw-r–r– 1 root root 3308306 1月 17 23:53 /var/log/sa/sar17
-rw-r–r– 1 root root 5179888 1月 16 23:59 /var/log/sa/sa16
-rw-r–r– 1 root root 3310498 1月 16 23:53 /var/log/sa/sar16
-rw-r–r– 1 root root 5191968 1月 15 23:59 /var/log/sa/sa15
-rw-r–r– 1 root root 3312848 1月 15 23:53 /var/log/sa/sar15
-rw-r–r– 1 root root 5191968 1月 14 23:59 /var/log/sa/sa14
-rw-r–r– 1 root root 3306028 1月 14 23:53 /var/log/sa/sar14
-rw-r–r– 1 root root 5198008 1月 13 23:59 /var/log/sa/sa13
-rw-r–r– 1 root root 3310618 1月 13 23:53 /var/log/sa/sar13
-rw-r–r– 1 root root 5198008 1月 12 23:59 /var/log/sa/sa12
-rw-r–r– 1 root root 3308278 1月 12 23:53 /var/log/sa/sar12
-rw-r–r– 1 root root 5201028 1月 11 23:59 /var/log/sa/sa11
-rw-r–r– 1 root root 3310616 1月 11 23:53 /var/log/sa/sar11
-rw-r–r– 1 root root 5204048 1月 10 23:59 /var/log/sa/sa10
-rw-r–r– 1 root root 3310558 1月 10 23:53 /var/log/sa/sar10
-rw-r–r– 1 root root 5191968 1月 9 23:59 /var/log/sa/sa09
-rw-r–r– 1 root root 3312768 1月 9 23:53 /var/log/sa/sar09
-rw-r–r– 1 root root 5191968 1月 8 23:59 /var/log/sa/sa08
-rw-r–r– 1 root root 3308278 1月 8 23:53 /var/log/sa/sar08
-rw-r–r– 1 root root 5207068 1月 7 23:59 /var/log/sa/sa07
-rw-r–r– 1 root root 3308313 1月 7 23:53 /var/log/sa/sar07
-rw-r–r– 1 root root 5185928 1月 6 23:59 /var/log/sa/sa06
-rw-r–r– 1 root root 3310549 1月 6 23:53 /var/log/sa/sar06
-rw-r–r– 1 root root 5198008 1月 5 23:59 /var/log/sa/sa05
-rw-r–r– 1 root root 3310568 1月 5 23:53 /var/log/sa/sar05
-rw-r–r– 1 root root 5198008 1月 4 23:59 /var/log/sa/sa04
-rw-r–r– 1 root root 3306018 1月 4 23:53 /var/log/sa/sar04
-rw-r–r– 1 root root 5188948 1月 3 23:59 /var/log/sa/sa03
-rw-r–r– 1 root root 3308288 1月 3 23:53 /var/log/sa/sar03
-rw-r–r– 1 root root 5194988 1月 2 23:59 /var/log/sa/sa02
-rw-r–r– 1 root root 3310624 1月 2 23:53 /var/log/sa/sar02
-rw-r–r– 1 root root 3308308 1月 1 23:53 /var/log/sa/sar01
-rw-r–r– 1 root root 5201028 12月 31 23:59 /var/log/sa/sa31
-rw-r–r– 1 root root 3308328 12月 31 23:53 /var/log/sa/sar31
-rw-r–r– 1 root root 5185928 12月 30 23:59 /var/log/sa/sa30
-rw-r–r– 1 root root 3306008 12月 30 23:53 /var/log/sa/sar30
実行環境(実行環境やコマンドのバージョンによって実行結果が異なる場合がありますので注意して下さい)
[root@raspi3b_plus ~]# uname -a
Linux raspi3b_plus.centos7 4.14.92-v7+ #1187 SMP Wed Jan 9 20:01:54 GMT 2019 armv7l armv7l armv7l GNU/Linux

[root@raspi3b_plus ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (AltArch)

[root@raspi3b_plus ~]# ls –version
ls (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Richard M. Stallman および David MacKenzie

bs