bash find xargs grepは一度だけ表示されます。

bash find xargs grepは一度だけ表示されます。

たぶんこれは少し奇妙かもしれません。おそらくこれを行う他のツールがあるかもしれませんが、何...

特定の文字列を含むすべてのファイルを見つけるには、次の基本的なbashコマンドを使用します。

find . -type f | xargs grep "something"

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

答え1

検索範囲に保管してください。

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

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

-execそれが実現すると、-type fWillは機能します。そして一致すると(success / true)grepが返されるので0トリガーされます。-exec grep "something"-quit

答え2

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

これが正確に行われること:head終了すると、パイプラインの中間要素に「壊れたパイプ」信号が通知され、それが再び終了し、次のfind通知が表示されます。

xargs: grep: terminated by signal 13

これはそれを確認します。

答え3

ツールを変更せずにこれを行うには:(私は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

関連情報