find ... -exec grepでファイル名と行番号の両方を返す方法は?


45

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

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

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

回答:


51

コマンドラインスイッチは、ファイルが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など)。


4
この答えは、-Hフラグgrep非標準のGNU拡張であることを指摘し、非GNUシステムの代替アプローチを提示することで改善できます。
小次郎

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

(またはGNU grepを使用、-Hオプションを参照)


+と-Hの両方がうまくいきます、ありがとう!
ダニージョリス

:そして、この回答に関連unix.stackexchange.com/questions/3682/...
Danny_Joris

4
+1正しい。grep複数のファイル名引数を持つようにすると、一致するファイル名を強制的に出力するからです。賢い!
小次郎

-1

grepが再帰-rフラグをサポートしている場合、これにより要求が解決されます。

grep -rn "String to search " * 

1
それは本当ですが、これが既存の答えに追加するものがわかりません。
ワイルドカード

また、現在のディレクトリに(ドット以外の)ファイルが1つしかない場合、ファイルの名前は表示されません。
G-Manが「Reinstate Monica」と言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.