![Bash 脚本新手-意外的文件结束错误](https://linux22.com/image/528108/Bash%20%E8%84%9A%E6%9C%AC%E6%96%B0%E6%89%8B-%E6%84%8F%E5%A4%96%E7%9A%84%E6%96%87%E4%BB%B6%E7%BB%93%E6%9D%9F%E9%94%99%E8%AF%AF.png)
我时不时地在服务器上运行 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
,进行了一些小的常规清理,注释掉了一个部分(缺少我添加的if
和then
),只有当大小相等时才能到达该部分,并将条件移至<=
下一个更高的if
,删除了不必要的sed
和tail
。
答案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
}
您可以指定压缩、大小、频率、保留和许多其他选项。