shell: ротация каталогов журналов, более компактный код, избегающий дублирования кода - PullRequest
0 голосов
/ 22 февраля 2019

в моих сценариях оболочки мне нужно вращать каталоги журналов.Я ищу более компактный, масштабируемый и элегантный способ, чем этот, но в настоящее время не знаю, как решить эту проблему, то есть в цикле 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 голосов
/ 26 февраля 2019

Спасибо за ваш вклад, команды 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
0 голосов
/ 23 февраля 2019

Следующие работы:

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 в LOGDIR1 и LOGDIR2 и ..LOGDIR15.

Мне кажется неизвестным, почему вы используете переменные $LOGDIR_OLD15, а не только сами имена каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...