findを使用して、最初に一致したファイルのみを検索しますか?


17

*.txtディレクトリに何百ものファイルがあるかもしれないとしましょう。最初の3つの*.txtファイルを見つけて、検索プロセスを終了するだけです。

findユーティリティを使用してこれを達成する方法は?私はそのマニュアルページをざっと目を通しましたが、このためのそのようなオプションではないようでした。


3
find . -name '*.txt' -print -quit最初の一致のみを表示し、最初の一致のfind後に終了させることができます。「n個の一致を検出した後に終了する」というケースに適応できるかどうかはわかりません。
NN

回答:


22

あなたはfindスルーの出力をパイプすることができますhead

find . -name '*.txt' | head -n 3

2
これを知っていたので、最初の3つの一致するファイルを見つけた後、検索プロセスを終了します。気にしない一致したファイルが大量にある可能性があります。
mitnk

2
頭が最初の3つのファイルを印刷すると、findコマンドは終了すると思います
クリスカード

1
はい、それは奇妙ですが、あなたは正しいです。
mitnk

19
それはまったく奇妙ではありません-それはUNIXでパイプがどのように機能するかです。head起動し、パイプの左側からの入力を待ちます。次にfind起動し、指定された基準に一致するファイルを検索し、パイプを介して出力を送信します。ときにhead要求された行の数を受信して印刷した、それはパイプを閉じ、終了します。find閉じたパイプに気づき、終了します。シンプルでエレガント、そして効率的。
D_Bye

3
要約すると、-n 3あるPOSIXの互換性、および可能性が高い、より移植可能にします。
-l0b0

4

この他の答えには多少欠陥があります。コマンドは

find . -name '*.txt' | head -n 3

次に、コメントの1つに説明があります [強調鉱山]:

head起動し、パイプの左側からの入力を待ちます。次にfind起動し、指定された基準に一致するファイルを検索し、パイプを介して出力を送信します。ときにhead要求された行の数を受信して印刷した、それはパイプを閉じ、終了します。find閉じたパイプに気づき、終了します。シンプル、エレガント、効率的

これはほとんど真実です。

問題は、find閉じようとしているパイプに書き込みを試みたときにのみ、閉じたパイプに気付くことです。この場合は、4番目の一致が見つかったときです。しかし、4番目の一致がない場合findは続行されます。シェルが待ちます!スクリプトで発生した場合、パイプの出力が最終であり、何も追加できないことがわかっているにもかかわらず、スクリプトは待機します。それほど効率的ではありません。

この特定のfind要素が単独で高速に終了する場合、効果は無視できますが、大きなファイルツリーでの複雑な検索では、コマンドは次に何をしたいかを不必要に遅らせる場合があります。

それほど完璧ではないソリューションは、実行することです

( find … & ) | head -n 3

このように、head終了すると、シェルはすぐに続行します。バックグラウンドfindプロセスは、無視される場合があります(遅かれ早かれ終了します)pkillまたは何かを対象としています。


概念を証明するために、検索できます/。一致するのは1つだけですが、findすべての場所で検索されるため、時間がかかる場合があります。

find / -wholename / 2>/dev/null | head -n 1

問題が見つかったらすぐにCtrl+で終了Cします。今比較してください:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.