在bash脚本

时间:2015-10-15 02:32:03

标签: bash shell

我正在尝试创建一个shell脚本,将最后n个文件保存在目录中并删除其余文件。我正在使用的配置文件如下:

#config
dir1="/home/user/test"
n1="2"
dir2="/home/user/test/temp"
n2="3"

我打算实现的是转到dir1并保留最后的n1个文件。 我正在测试以下代码

source /home/cfolder/config
ls -t $dir1 | sed -e '1,'$n1'd' | xargs -d '\n' rm

如何在没有为每个dir和n组明确编写代码行的情况下让代码循环遍历所有配置参数?

2 个答案:

答案 0 :(得分:1)

我不知道如何根据问题的设置方式做你想做的事情。但是,这是另一种可以用于此类问题的方法。

对于单独的配置,我喜欢使用名为X,Y或Z.conf的配置文件(当然,用有意义的名称替换X,Y和Z)。

在这些.conf文件中,使用dirn代替dir1和n1。

#X.conf
dir="/home/user/test"
n="2"

#Y.conf
dir="/home/user/test/temp"
n="3"

然后,在bash脚本中,我会这样做:

# runconfigs.sh
for config in ./*.conf; do
    <your_script_name_goes_here>.sh "$config"
done

在您的脚本中,您可以使用类似

的内容
#yourscript.sh
source "$1"
ls -t $dir | sed -e '1,'$n'd' | xargs -d '\n' rm

然后,您只需运行./runconfigs.sh即可。我发现当你处理许多配置时,这种方法会变得更有用,但我不明白为什么它在这里也不适用。

答案 1 :(得分:1)

为了更好的设计视角,建议如下配置文件,其中每行的第一个字段是目录,第二个是文件的数量,然后循环它

# config.conf
/home/user/test:5
/home/user/temp:2

# script.sh
# 
while IFS=: read -r dir days; do
    # your cmd to remove file using $dir and $days
    cd $dir
    ls -tr | head -n -$days | xargs rm
done < config.conf