Bash スクリプト、ファイル サイズの検索と比較が実行されない

Bash スクリプト、ファイル サイズの検索と比較が実行されない

以下のコードを見るとわかるように、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バイト、つまり 18 GB です。

私が望んでいるのは、それが 60 GB 未満の場合にコマンドを実行することです。この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

関連情報