回答:
あなたは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個の一致を検出した後に終了する」というケースに適応できるかどうかはわかりません。