web-dev-qa-db-ja.com

ファイル内のテキストを検索して複数のサブフォルダーを検索するにはどうすればよいですか?

関数名を探していますが、フォルダ構造が深く、見なければならないファイルがたくさんあります。

通常、私はfind * | grep functionnameしかし、それが最善の方法ですか?

7
tooshel
$ find . -type f -print0 | xargs -0 grep foo
$ grep -r foo . # GNU grep only

zshsetopt extendedglob

$ grep foo **/*(.)
15
geekosaur

ack もあります。これは、この種のタスク用に特別に設計されており、サブフォルダーを自動的に検索します。

5
alex

find | xargs応答の代わりに、テキストではなく、具体的には関数名を検索していると言うので、 ctags の使用を検討してください。

これを行うには、ソースに対してctagsを実行してTAGSファイルを作成し、次にgrepに対してTAGSを実行して、行を吐き出します次の形式で:

{tagname}<Tab>{tagfile}<Tab>{tagaddress}

ここで、tagnameには関数名が含まれ、tagfileはそれが含まれているファイル、tagaddressはその行に移動するためのviコマンドです。 (単なる行番号にすることもできます。)

(Eclipseが構築するさまざまなインデックスと同様のことを行う簡単な方法はありますか、それともEclipseデータベースにクエリを実行するだけですか?)

2
Jerry Asher

どうしたの grep -r(== grep --recursive)?ここで何か不足していますか?

(+1のackも-両方を定期的に使用しています)

編集:私はあなたが持っていない場合の可能性と落とし穴を詳述する優れた記事を見つけましたGNU grepここ 。しかし、真剣に、あなたが持っていない場合GNU grep利用可能、ackを取得することを強くお勧めします。

1
simon

ディスクが高速な場合は、grepを並列化することができます。

find . -type f -print0 | parallel -0 grep foo

GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ の詳細については、紹介ビデオをご覧ください

0
Ole Tange

$ find -type f -print0 | xargs -r0 grep foo

-r in xargsは、入力がない場合にコマンドの実行を回避します。 GNU拡張です。

このために特別に設計された ag もあり、ackよりも優れています。最近のDebian/Ubuntuバージョンのパッケージ silversearcher-ag で利用できます。

0
mmoya

find . | xargs grepはスペースのあるファイル名では失敗します:

> echo test > "a b c"
> find . | xargs grep test
grep: ./a: No such file or directory
grep: b: No such file or directory
grep: c: No such file or directory

-print0にもこの問題があることに注意してください。

私の意見では-exec grepすべてのファイル名を内部的に処理し、この問題を回避するfindを使用します。

> find . -exec grep test {} \;
test
>
0
JRW