多分それは少し奇妙です-そして多分これを行う他のツールがありますが、まあ..

次の従来のbashコマンドを使用して、文字列を含むすべてのファイルを検索しています。

find . -type f | xargs grep "something" 

複数の深さのファイルが多数あります。 。「何か」の最初の出現で十分ですが、findは検索を続行し、残りのファイルを完了するのに長い時間がかかります。私がやりたいのは、grepからの「フィードバック」のようなものです。 findは、さらに多くのファイルの検索を停止する可能性があります。そのようなことは可能ですか?

回答

単にfindの領域内に保持してください:

find . -type f -exec grep "something" {} \; -quit 

仕組みは次のとおりです:

-execは、-type fはtrueになります。また、grep0(成功/ true)を返すため、が一致すると、-quitがトリガーされます。

回答

find -type f | xargs grep e | head -1 

はまさにそれを行います:headが終了すると、パイプの中央の要素に「壊れたパイプ」が通知されます”信号を送り、順番に終了し、findに通知します。

xargs: grep: terminated by signal 13 

これを確認する通知が表示されます。

コメント

  • +1の説明と代替案。ただし、他の回答は自給自足であるため、私にはよりエレガントに思えます。

回答

ツールを変更せずにこれを行うには:(xargsが大好きです)

#!/bin/bash find . -type f | # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20 # grep -m1: show just on match per file # grep --line-buffered: multiple matches from independent grep processes # will not be interleaved xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >( # Error output (stderr) is redirected to this command. # We ignore this particular error, and send any others back to stderr. grep -v "^xargs: .*: terminated by signal 13$" >&2 ) | # Little known fact: all `head` does is send signal 13 after n lines. head -n 1 

コメント

  • +1は、xargsにそのようなマルチタスク機能があることを知りませんでした-他のコメントにも感謝します! 🙂

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です