「検索」が一致するものを見つけたかどうかをどのように検出しますか?

「検索」が一致するものを見つけたかどうかをどのように検出しますか?

「find」が一致するものを見つけたかどうかを検出する慣用的な方法はありますか?私は現在使用しています

COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then

しかし、これは私にとって少し間接的なようです。また、findが一致するものを見つけたら、検索を中断して時間と労力を無駄にしないようにしたいと思います。一致するファイルがあるかどうかを知りたいです。

修正する:私はコードなしで質問を書く間違いを犯しました。私はwc -lそれを別の状況で使用し、とにかく見つかったファイルの総数を知る必要があります。一致するものがあるかどうかをテストする場合はif [ -z $(find …) ]

答え1

GNU検索があることがわかっている場合は、次のようにします。-quit 最初のゲームが終わったら停止します。

出力findを。head -n 1findhead

wcどちらも文字列が空であることをテストする必要はなく、シェルはそれ自体をテストできます。

if [ -n "$(find … | head -n 1)" ]; then …

答え2

あなたはそれを使用することができます-quit最初のゲームの後、操作は中止されました。これを他のタスク(たとえば-print)と組み合わせることができます。そうでなければ、何も見つかったかどうかはわかりません。

たとえば、find ... -print -quit最初に一致するファイルのパスを印刷してから終了します。または、-printf 1 -quit一致するものがある場合は1を印刷し、一致するものがない場合は何も印刷しない可能性があります。

findの終了ステータスは、検索中にエラーが発生したかどうかを反映し、見つかった項目があるかどうかを反映するため、一致するものがあるかどうかを確認するには、出力を確認する必要があります。

答え3

Exit 0は見つけやすく、Exit> 0は通常エラーがある場合にのみ発生するため、より困難です。しかし私達はそれを実現できます:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

このソリューションは、サブシェルを使用するよりもパフォーマンスが優れています。 falseを実行する方が、Dashを実行するよりも確かに高速です。

$ cat alfa.sh bravo.sh charlie.sh delta.sh
find -name non-existing-file -exec false {} +
find -name existing-file -exec false {} +
[ "$(find -name non-existing-file)" ]
[ "$(find -name existing-file)" ]

$ strace dash alfa.sh | wc -l
807

$ strace dash bravo.sh | wc -l
1141

$ strace dash charlie.sh | wc -l
1184

$ strace dash delta.sh | wc -l
1194

答え4

次のようにシェル条件付きでラップできます。

[ "$(find . ...)" '!=' '' ] && echo Found || echo Not found

...一致基準はどこにありますか-name *.txt

他の例:

[ "$(find /etc -name hosts)" ] && echo True || echo False
[ ! -z "$(find /etc -name hosts)" ] && echo True || echo False

関連情報