多分それは少し奇妙です-そして多分これを行う他のツールがありますが、まあ..
次の従来のbashコマンドを使用して、文字列を含むすべてのファイルを検索しています。
find . -type f | xargs grep "something"
複数の深さのファイルが多数あります。 。「何か」の最初の出現で十分ですが、findは検索を続行し、残りのファイルを完了するのに長い時間がかかります。私がやりたいのは、grepからの「フィードバック」のようなものです。 findは、さらに多くのファイルの検索を停止する可能性があります。そのようなことは可能ですか?
回答
単にfindの領域内に保持してください:
find . -type f -exec grep "something" {} \; -quit
仕組みは次のとおりです:
-exec
は、-type f
はtrueになります。また、grep
は0
(成功/ 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にそのようなマルチタスク機能があることを知りませんでした-他のコメントにも感謝します! 🙂