find+execで変数を設定するには?

find+execで変数を設定するには?

特定の場所に空のファイルがあるかどうかを調べ、見つかった場合は、電子メールを送信する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

おすすめ記事