web-dev-qa-db-ja.com

特定の文字列のディレクトリ内のすべての.Javaファイルをgrepします

Mac OS Xの現在のディレクトリとすべてのサブディレクトリですべての.Javaファイルで単純な文字列(正規表現ではない)を検索するにはどうすればよいですか?一致するファイル名とディレクトリ名のリストを印刷したいだけです。

12
John Topley

そして常に人気のある

find . -name '*.Java' | xargs grep -l 'string'

[〜#〜] edit [〜#〜](Frank Szczerbaによる):

スペースを含むファイル名またはディレクトリを処理する場合、これを行う最も安全な方法は次のとおりです。

find . -name '*.Java' -print0 | xargs -0 grep -l 'string'

それを行うには常に複数の方法があります。

19

従来のUNIXの回答は、この質問で受け入れられたものです。

find . -name '*.Java' | xargs grep -l 'string'

これはおそらくJavaファイルで機能しますが、ファイル名のスペースは従来のUNIXの世界よりもMacではるかに一般的です。スペースのあるファイル名が上記のパイプラインを通過すると、xargsは異なる名前としての個々の単語。

本当に必要なのは、名前をnul-separateして、境界を明確にすることです。

find . -name '*.Java' -print0 | xargs -0 grep -l 'string'

別の方法は、Markが示唆するように、run grepを検索できるようにすることですが、多数のファイルを検索する場合は、そのアプローチは遅くなります(grepは、ファイルのリスト全体で1回ではなく、ファイルごとに1回呼び出されるため)。

11
Frank Szczerba

Grepよりも優れたgrepを使用してください ack

ack -l --Java  "string" 
7
bortzmeyer

これは、必要に応じて実際に正規表現を使用し、メタ文字に近づかないようにするか、メタ文字をエスケープして、文字列を検索できます。

find . -iname "*.Java" -exec egrep -il "search string" {} \;
4
Mark Thalman
grep -rl --include="*.Java" simplestring *
3
js.

これはOSXの質問なので、OSX固有の回答を次に示します。

findをスキップし、コマンドラインからSpotlightを使用します。はるかに強力です!

コマンドラインスポットライト– GREPに会う

ほとんどの人は、コマンドラインからSpotlight検索を実行できることを知りません。難解なfindとgrepのオプションをすべて覚えているのはなぜですか。また、Spotlightに作業を任せることができるのはなぜですか。 Spotlightへのコマンドラインインターフェイスはmdfindと呼ばれます。コマンドラインでスクリプト化できるため、GUISpotlight検索と同じ機能などを備えています。

1
user22908

TextWrangler のようなGUIプログラムを使用して、オプションがインターフェイスにある場合に、より直感的な検索を実行することもできます。

0
Mark Thalman
grep "(your string)" -rl $(find ./ -name "*.Java")

大文字と小文字を区別しない場合は、-rlを-irlに置き換えます。 (文字列)必要性が見られた場合は、正規表現になることもあります。

0
laughing_man

これを試してみてください:

grep -rl "string" */*Java
0
dwj