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


12

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


これを聞いてくれてありがとう、そうする必要はない。ここで、「。git」を除外する方法を理解する必要があり、少しは終わりました。
ダンローゼンスターク

jsの答えはもっと簡潔で、まだ--includeを入力しなければならないのは面倒だと思いますが、それでもです。おそらくそれを隠すためにエイリアスを書くことができます
クレイグタタリン

回答:


19

そして、常に人気の

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

編集(フランク・シュツェルバによる):

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

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

常に複数の方法があります。



11

従来のUNIXの答えは、この質問に対して受け入れられたものです。

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

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

本当に欲しいのは、名前をヌルで区切って境界を明確にすることです:

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

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


xargsで「--replace」オプションを使用して、スペースを含むファイル名を処理することもできます。xargs --replace grep 'string' '{}'({}はファイル名に置き換えられます)
arathorn

1
最新バージョンのfind(OS Xにインストールされているものを含む)は、「-exec <command> {} +」をサポートします。 ...これは、xargs(1) "(manページから)のそれに似ています。
ダグ・ハリス

7

grep、ackよりも優れたgrepを使用します。

ack -l --java  "string" 

3
ackはデフォルトではMac OS Xにインストールされていません。
ジョン・トップリー

「デフォルト」の意味がわかりません。多くのOSでは、インストールするものを選択するため、常に存在するプログラムを見つけることは困難です。当時、Cコンパイラが常にだったとPerlは珍しいだった...
bortzmeyer

1
これは、標準OSインストールの一部であることを意味します。Macに開発者ツールをインストールしていますが、ackをインストールしません。自分でインストールする必要があります。それがあれば、それはいい構文です。
ジョン・トップリー

ackの場合、これはモジュールに依存しない単一のPerlプログラムです。〜/ binディレクトリにプログラムを「インストール」できる場合、ackも同様に簡単に「インストール」できます。
アンディレスター

4

これは、必要に応じて正規表現を実際に使用し、メタ文字から離れるか、エスケープするだけで、文字列を検索できます。

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
これがここでの最良の答えのようです-grepがそれをすべて行う場合、なぜfind&xargsを使用するのですか?
ピーターギブソン

FYI、質問に尋ねているものを考えると、それは、そのコマンドに小さな「L」ビッグません「L」である必要があります
クレイグTataryn

クレイグは正しいです、私は私の答えを修正しました。
js。

1

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

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

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

ほとんどの人は、コマンドラインからSpotlight検索を実行できることを知りません。すべての不可解なfindおよびgrepオプションを覚えているのはなぜですか。Spotlightに作業を任せることができるのはいつですか。Spotlightのコマンドラインインターフェイスはmdfindと呼ばれます。コマンドラインでスクリプト可能なため、GUI Spotlight検索などと同じパワーを持っています!


0

これを試してください:

grep -rl "string" */*java

1
これにより、Mac OS Xで「grep:* / * java:No
such

ここでの問題は、*。javaファイルを1レベルだけしか見つけられないことです。IMHOの適切な方法については、Mark Thalmanの回答を参照してください。
ルートヴィヒワインツィール

申し訳ありませんが、私のMacではありません。Macバージョンのgrepには-r(再帰)フラグがありませんか?
dwj

それはありますが、それはファイルにあることがわかっている文字列を検索したときに得られた出力でした。
ジョントップリー


0
grep "(your string)" -rl $(find ./ -name "*.java")

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.