shell:日志目录轮换,更紧凑的代码避免代码重复

时间:2019-02-22 10:12:07

标签: bash shell log-rotation

在我的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的想法吗? 任何帮助都将不胜感激。 非常感谢您的前期准备。

2 个答案:

答案 0 :(得分: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

将名为LOGDIR的目录移动到LOGDIR1LOGDIR2以及.. LOGDIR15

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

答案 1 :(得分:0)

感谢您的输入,命令seq和tac对我来说是新的。 现在,我花了一些时间重新编写代码,并采纳了一些不错的想法。 我的目标是获得一个易于理解和维护的可伸缩解决方案。

我决定将当前的日志目录命名为“ $ 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
相关问题