正如您将在下面的代码中看到的那样,对于 bash 来说非常陌生。
我想获取文件的文件大小(以字节为单位),将其与固定值进行比较,如果后者太小则发送电子邮件。
代码:
#!/bin/bash
f=$(find /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz -ctime 0 -print -exec ls -l {} \; | awk '{print $5}')
if [$f -lt 60000000000] ; then
echo "hello";
fi
上面命令的输出是18607414901
字节,即18gb。
我想要的是如果小于 60gb 则执行命令。该echo
命令仅用于测试。
./backupsql.sh: line 4: [: missing `]'
答案1
您在测试中需要一些空格:
if [ $f -lt 60000000000 ] ;then
echo "Hello"
fi
答案2
您可以使用wc
带有选项的命令-c
(打印字节数) 获取文件大小(以字节为单位)以进行进一步比较:
#!/bin/bash
s=$(wc -c < /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
另一种方法是使用带选项stat
的命令-c
:
#!/bin/bash
s=$(stat -c "%s" /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz)
if [ $s -lt 60000000000 ]; then
echo "hello"
fi
-c
- 告诉使用指定的格式
%s
- 表示总大小的格式,以字节为单位
答案3
脚本?这是一句:
[ $(stat -c %s $(ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz | tail -n 1)) -lt 60000000000 ] && echo "Error" | mail -s "Too small" [email protected]
ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz
将按时间戳倒序列出所有文件。最后一张是最新的。tail -n 1
将显示最后一个文件。$(..)
是命令的文本。stat -c %s <file>
将显示文件的大小。[ ... ]
实际上是命令 /usr/bin/test 如果返回代码是0
它将运行之后的命令&&
。
如果您在 crontab 中运行此命令,则必须%
使用转义\
,例如[ $(stat -c \%s ..
脚本版本:
#! /bin/bash
LASTFILE=$(ls -tr /var/lib/xxxxxx/backups/xxxxxxxxDB*.gz | tail -n 1)
if [ $(stat -c %s $LASTFILE) -lt 60000000000 ]; then
echo "$LASTFILE" | mail -s "Too small" [email protected]
fi