
正如您將在下面的程式碼中看到的那樣,對於 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