我在服务器上不时运行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
答案 0 :(得分:2)
答案 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”