在我的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的想法吗? 任何帮助都将不胜感激。 非常感谢您的前期准备。
答案 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
的目录移动到LOGDIR1
和LOGDIR2
以及.. 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