find ... -exec grepを使用してファイル名と行番号を返すにはどうすればよいですか?

find ... -exec grepを使用してファイル名と行番号を返すにはどうすればよいですか?

find文字列を検索するときにファイル名と行番号をどのように返しますか?あるコマンドはファイル名を返し、別のコマンドでは行番号を返しましたが、それらを組み合わせることはできないようです。

ファイル名:find . -type f -exec grep -l 'string to search' {} \;

行番号:find . -type f -exec grep -n 'string to search' {} \;

答え1

コマンドラインスイッチは、ファイルが1つしかない場合でもファイル名を強制的に-H印刷します。grep

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

次のように注意してくださいゴジロで言ったコメント、これはPOSIX標準の一部ではなく、GNUとBSD grepの両方に存在しますが、一部のシステム(Solarisなど)には含まれない場合があります。

答え2

非標準-Hまたは-r/-Rオプションを使用しない限り、grepファイル名は複数のファイル名が渡されたときにのみ出力されるため、次のことができます。

find . -type f -exec grep -n 'string to search' /dev/null {} +

{} + 構文を使用するとfind必要なだけ多くのファイルを渡しますgrepが、 を使用すると各ファイルに対して 1 つずつ{} ';'実行するためgrep、非常に非効率的です。

/dev/null少なくとも2つのファイルを取得するために追加(存在し、空であることを保証)しますgrep。これは、現在のディレクトリまたは下のディレクトリに通常のファイルが1つしかない場合、またはファイルのリストが次のように分割さfindれている場合に適しています。最後の実行にはファイルが1つしかなかった方法です。

ちなみに、次の-exec grep regex {} +場合findの終了状態はゼロではありません。どのgrepゼロ以外の終了状態で終了するコールです。find特定のディレクトリを閲覧/読み取りできない場合、またはファイルメタデータを取得できない場合でも、ゼロではありません。find返された終了ステータスが0の場合、すべてのディレクトリをfind参照できます。みんな grep呼び出しは成功しますが(少なくとも1つの一致がある1つ以上のファイルが見つかりました)、ゼロ以外の値を返しても必ずしも一致が見つからなかったわけではありません。

の終了状態は、-exec grep regex {} ';'述語(条件として使用可能)が成功したかどうかを確認するためにのみ使用され、終了状態には反映されません。 soの終了ステータスは、すべてのファイルが見つかるかどうかにのみ関連します。grep-execfindfind

答え3

grepが再帰-rフラグをサポートしている場合、要求は解決される可能性があります。

grep -rn "String to search " * 

関連情報