回答:
あなたはfindスルーの出力をパイプすることができますhead:
find . -name '*.txt' | head -n 3
head起動し、パイプの左側からの入力を待ちます。次にfind起動し、指定された基準に一致するファイルを検索し、パイプを介して出力を送信します。ときにhead要求された行の数を受信して印刷した、それはパイプを閉じ、終了します。find閉じたパイプに気づき、終了します。シンプルでエレガント、そして効率的。
この他の答えには多少欠陥があります。コマンドは
find . -name '*.txt' | head -n 3
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
find . -name '*.txt' -print -quit最初の一致のみを表示し、最初の一致のfind後に終了させることができます。「n個の一致を検出した後に終了する」というケースに適応できるかどうかはわかりません。