特定の場所に空のファイルがあるかどうかを調べ、見つかった場合は、電子メールを送信するbashスクリプトを作成しようとしています。最初は「検索」と「メール」を組み合わせようと思っていましたが、その場所に空のファイルが複数ある場合は、不要なメールが複数送信されるので、探して設定する前にフラグを入れることを考えました。変数は以下で設定されます。 0から1までで、空のファイルがあるかどうかを確認するために検索が行われます。私が試したことは次のとおりです。
FLAG=0
find $LOCATION -size 0 -type f -exec sh -c 'export FLAG=1' \;
echo $FLAG
ところが問題は、その場所に空のファイルがあってもフラグ値が1に変わらないという点だ。私は何が間違っていましたか?
ベストアンサー1
set -- "${LOCATION}/"*
while [ -s "$1" ] ; do shift ; done
[ -e "$1" ] && FLAG=1
シェル組み込みコマンドは、[ test ]
ize演算子で使用できます-s
。からman test
:
-s FILE
FILE
存在し、サイズが0より大きい。
しかし、再帰的な検索ではこれは簡単ではありません。
find
はい、しかし、ブール値を設定するのと同じように、単純な操作の場合、実際にはこの場合には適していません。ls
再帰検索も同様にすばやく行うことができ、ファイルサイズをリストの最初のフィールドとして提供するように簡単に設定でき、1行に1つの項目のみを一覧表示することができます。再帰ファイルリストにサイズが0のファイルが含まれているかどうかに応じてシェル変数のブール値を設定する場合は、これがls
最善の選択ですfind
。これは状況を複雑にするだけです。興味のあるものはファイルの場所ではなく、ファイルのプロパティです。それがls
光を発する場所であり、grep
出力をpingすることは非常に簡単です。
これは簡単に行えます。
ls -1aqRsp "$LOCATION" 2>&1 | grep -qv "^ *[^0]\|/"
FLAG=$(($?==0))
これは、ファイルが次FLAG
の場合にのみ設定されます。1
隠された .dot
埋め込みファイル -$LOCATION
そのサブディレクトリの1つに存在し、サイズが0です。それ以外の場合は$FLAG
そうです0
。