関数名を探していますが、フォルダ構造が深く、見なければならないファイルがたくさんあります。
通常、私はfind * | grep functionname
しかし、それが最善の方法ですか?
$ find . -type f -print0 | xargs -0 grep foo
$ grep -r foo . # GNU grep only
zsh
とsetopt extendedglob
、
$ grep foo **/*(.)
ack
もあります。これは、この種のタスク用に特別に設計されており、サブフォルダーを自動的に検索します。
find | xargs
応答の代わりに、テキストではなく、具体的には関数名を検索していると言うので、 ctags の使用を検討してください。
これを行うには、ソースに対してctags
を実行してTAGS
ファイルを作成し、次にgrep
に対してTAGS
を実行して、行を吐き出します次の形式で:
{tagname}<Tab>{tagfile}<Tab>{tagaddress}
ここで、tagname
には関数名が含まれ、tagfile
はそれが含まれているファイル、tagaddress
はその行に移動するためのviコマンドです。 (単なる行番号にすることもできます。)
(Eclipseが構築するさまざまなインデックスと同様のことを行う簡単な方法はありますか、それともEclipseデータベースにクエリを実行するだけですか?)
どうしたの grep -r
(== grep --recursive
)?ここで何か不足していますか?
(+1のack
も-両方を定期的に使用しています)
編集:私はあなたが持っていない場合の可能性と落とし穴を詳述する優れた記事を見つけましたGNU grep
ここ 。しかし、真剣に、あなたが持っていない場合GNU grep
利用可能、ack
を取得することを強くお勧めします。
ディスクが高速な場合は、grepを並列化することができます。
find . -type f -print0 | parallel -0 grep foo
GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ の詳細については、紹介ビデオをご覧ください
$ find -type f -print0 | xargs -r0 grep foo
-r
in xargs
は、入力がない場合にコマンドの実行を回避します。 GNU拡張です。
このために特別に設計された ag
もあり、ack
よりも優れています。最近のDebian/Ubuntuバージョンのパッケージ silversearcher-ag で利用できます。
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
>