Bash 脚本新手-意外的文件结束错误

Bash 脚本新手-意外的文件结束错误

我时不时地在服务器上运行 bash 脚本,我正在尝试编写一个脚本来监控日志文件夹,并在文件夹超出定义容量时压缩日志文件。我知道有更好的方法可以完成我目前正在尝试做的事情,非常欢迎您的建议。以下是我的脚本。

 dir_base=$1
 size_ok=5000000
 cd $dir_base
 curr_size=`du -s -D | awk '{print $1}' | sed 's/%//g' `
 zipname=archive`date +%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

答案1

dir_base=$1
size_ok=5000000
cd $dir_base
curr_size=$(du -s -D | awk '{print $1}')
zipname=archive$(date +%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 "Process files."
    for tfile in ${targfiles[@]}
    do
        curr_size=$(du -s -D | awk '{print $1}')
        if (( $curr_size <= $size_ok ))
        then
            echo "$size_ok has been reached. Stopping processes"
            break
        else
            if (( $curr_size > $size_ok ))
            then
                zip -r "$zipname" "$tfile"
                rm -f "$tfile"
                echo "Added '$tfile' to archive '$zipname.zip' and removed"
            # else 
            #    if (( $curr_size <= $size_ok ))
            #    then
            #        echo "files in $dir_base are less than 5G, not archiving"
            #    fi
            fi
         fi
    done
fi

我删除了不必要的分号,用 替换了反引号$()(并修复了缺少一个的地方),添加了两个缺失的fi和一个缺失的done,修复了缩进,使条件一致,引用了变量,替换了一个缺失的变量,删除了一个不必要的let,删除了不必要的 重新执行date,进行了一些小的常规清理,注释掉了一个部分(缺少我添加的ifthen),只有当大小相等时才能到达该部分,并将条件移至<=下一个更高的if,删除了不必要的sedtail

答案2

它完全坏了,也许没有全部粘贴?发现一个未关闭的 if 和一个未关闭的 for 循环。另外还有语法错误,带有“>”(替换为 -lt)

这有效:http://pastebin.com/aUC3xwa5

您还可以将其添加到其顶部:

dir_base=$1
size_ok=5000000
cd $dir_base
# the sed is probably unneccessary
curr_size=du -s -D | awk '{print $1}' | sed 's/%//g'
date=`date +%Y%m%d`
zipname="archived$date"

答案3

如果您使用的是基于 Red Hat 的发行版,则应该查看 logrotate 程序。您可以将自定义脚本添加到 /etc/logrotate.d/ 目录。您可以使用任何现有文件作为示例:

/etc/logrotate.d/httpd

  /var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

您可以指定压缩、大小、频率、保留和许多其他选项。

相关内容