新手在bash脚本协助请

时间:2010-10-21 10:23:33

标签: linux bash scripting

我在服务器上不时运行bash脚本,我正在尝试编写一个监视日志文件夹的脚本,并在文件夹超出定义的容量时压缩日志文件。我知道有更好的方法来做我目前正在做的事情,你的建议非常受欢迎。下面的脚本抛出错误“意外的文件结束”.Below是我的脚本。

dir_base=$1   
size_ok=5000000  
cd $dir_base  
curr_size=du -s -D | awk '{print $1}' | sed 's/%//g' zipname=archivedate +%Y%m%d

if (( $curr_size > $size_ok ))
then
    echo "Compressing and archiving files, Logs folder has grown above 5G"
    echo "oldest to newest selected."
    targfiles=( `ls -1rt` )
    echo "rocess files."
    for tfile in ${targfiles[@]}
    do
        let `du -s -D | awk '{print $1}' | sed 's/%//g' | tail -1`
        if [ $curr_size -lt $size_ok ];
        then
            echo "$size_ok has been reached. Stopping processes"
            break
        else  if [ $curr_size -gt $size_ok ];
        then
            zip -r $zipname $tfile
            rm -f $tfile
            echo "Added ' $tfile ' to archive'date +%Y%m%d`'.zip and removed"
        else [ $curr_size -le $size_ok ];
            echo "files in $dir_base are less than 5G, not archiving"
        fi

3 个答案:

答案 0 :(得分:2)

查看logrotate。这是一个example使用它。

答案 1 :(得分:0)

根据你给我们的东西,你没有“完成”来结束for循环和一个“fi”来结束主要的if。请重新格式化您的代码,您将获得更精确的答案......

编辑:

查看重新格式化的脚本,就是这样说的:“意外的文件结束”来自于你没有关闭“for”循环的事实,也不是你的“if”

由于您似乎模仿了logrotate行为,请按照@Hank建议检查...

MY2C

答案 2 :(得分:0)

我的du -s -D未显示%个符号。所以你可以做到。

curr_size=$(du -s -D)
set -- $curr_size
curr_size=$1

为您节省了一些开销,而不是du -s -D | awk '{print $1}' | sed 's/%//g

如果它确实显示%符号,您可以像这样摆脱它 du -s -D | awk '{print $1+0}'。无需使用sed

尽可能使用$()语法而不是反引号

对于targfiles=( ls -1rt ),您可以省略-1。所以它可以 targfiles=( $(ls -rt) )

尽可能在变量周围使用引号。例如“$ zipname”,“$ tfile”