0

在我的 shell 脚本中,我需要轮换日志目录。我正在寻找一种比这更紧凑、可扩展和优雅的方式,但目前不知道如何解决这个问题,即在 while 循环中并使用变量进行计算。

function f_rotate_logdirs()
{
        if [ -d $LOGDIR_OLD14 ]; then
                # be extra cautious, no rm -rf operation ...
                rm -rf $LOGDIR_OLD14
        fi
        if [ -d $LOGDIR_OLD13 ]; then
                mv $LOGDIR_OLD13 $LOGDIR_OLD14
        fi
        [...]
        if [ -d $LOGDIR_OLD1 ]; then
                mv $LOGDIR_OLD1 $LOGDIR_OLD2
        fi
        if [ -d $LOGDIR ]; then
                mv $LOGDIR $LOGDIR_OLD1
        fi
        mkdir -p $LOGDIR
        echo $DATE > $LOGDIR/0.DATE
}

您是否有一个更紧凑的代码的想法,可以轻松扩展到 n_days ?对此的任何帮助都会得到很大的帮助。非常感谢这个前期。

4

2 回答 2

0

以下作品:

rm -r -f LOGDIR15
seq 1 14 | tac | xargs -t -n1 sh -c 'if [ -d "$1$2" ]; then mv -n "$1$2" "$1$(($2+1))"; fi' -- LOGDIR
if [ -d "LOGDIR" ]; then mv -n "LOGDIR" "LOGDIR1"; fi
mkdir LOGDIR

我们需要分别处理第一个和最后一个。从中制作一个功能,将是:

backup() {
    rm -r -f "$1$2"
    seq 1 "$(($2 - 1))" | tac | 
    xargs -t -n1 sh -c 'if [ -d "$1$2" ]; then mv -n "$1$2" "$1$(($2+1    ))"; fi' -- "$1"
    if [ -d "$1" ]; then mv -n "$1" "$1"1; fi
    mkdir "$1"
}

用法:

backup LOGDIR 15

会将名为的目录移动到LOGDIRand LOGDIR1and LOGDIR2..LOGDIR15

我似乎不知道为什么要使用变量$LOGDIR_OLD15而不仅仅是目录名称本身。

于 2019-02-22T21:12:07.010 回答
0

感谢您的输入,命令 seq 和 tac 对我来说是新的。现在我找到了一些时间来重新编写它,并接受了你的一些好主意。我的目标是获得一个易于理解和维护的可扩展解决方案。

我决定将当前的 logdir 命名为“$dir.0”,因为我的一些脚本收集了每天使用的设备的配置差异。这使得编码更容易获得“5 到 3 天前”或“2 天前和今天”之间的差异。

#! /bin/sh

# Customizeable settings
LOGDIR_BACKUPS=14                       # max number of backups

# Directories
LOGDIR_NAME=logs
LOGDIR=$LOGDIR_NAME.0

# Defines
DATE=`date +'%Y%m%d-%H%M'`

function f_rotate_logdirs() {
        local dir=$1                    # name of logdir folder
        local max=$2                    # max #
        local min=0                     # $dir.0 = current logdir

        for i in `seq $min $max | tac`
        do
                case $i in
                        $max)   if [ -d $dir.$i ]; then
                                        rm -f $dir.$i/*
                                        rmdir $dir.$i
                                fi
                                ;;
                        $min)   if [ -d $dir.$i ]; then
                                        mv $dir.$i $dir.$((i+1))
                                fi
                                mkdir $dir.$i
                                echo $DATE > $dir.$i/0.DATE
                                ;;
                        *)      if [ -d $dir.$i ]; then
                                        mv $dir.$i $dir.$((i+1))
                                fi
                                ;;
                esac
        done
}

f_rotate_logdirs $LOGDIR_NAME $LOGDIR_BACKUPS
于 2019-02-26T14:48:52.197 回答