ツリー全体でコンテンツを検索したい場合は、
find . -type f -print0 | xargs -0 grep <search_string>
パフォーマンスまたは簡潔さの観点からこれを行うより良い方法はありますか?
grep
が-r
オプションをサポートしているかどうかを確認します(recurseの場合):
grep -r <search_string> .
次善の答え:find
の出力をgrep
にパイプする代わりに、単に実行することができます
find . -type f -exec grep 'research' {} '+'
そして出来上がり、2つではなく1つのコマンド!
説明 :
find . -type f
内のすべての通常のファイルを検索します。
-exec grep 'research'
grep 'research'
{}
見つかったファイル名
'+'
ファイル名ごとに1回ではなく、すべてのファイル名ごとに1つのコマンドを使用します。
Nb:';'
を使用すると、ファイル名ごとに1回必要になります。
それ以外に、それを使用してソースコードを処理する場合は、コードビットを簡単に検索するために作成されたack
を調べることができます。
編集:
その研究を少し拡張することができます。最初に、find
の-name ''
スイッチを使用して、特定の命名パターンを持つファイルを検索できます。
例えば :
ログに対応するファイルのみ:-name '*.log'
cヘッダーに対応するファイルのみですが、ファイル名拡張子は大文字または小文字に固執できません:-iname *.c
Nb:grep
やack
と同様に、-i
スイッチは、この場合、大文字と小文字を区別しないことを意味します。
その場合、grepは色と行番号なしで表示されます。
--color
および-n
スイッチを使用して、これを変更できます(それぞれ、ファイルの色と行番号)。
最後に、あなたは次のようなものを持つことができます:
find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'
例えば
$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello
サブディレクトリに再帰する場合:
grep -R 'pattern' .
-R
オプションは標準オプションではありませんが、最も一般的なgrep
実装でサポートされています。
上記のように、-r
または-R
(必要なシンボリックリンクの処理に応じて)は簡単なオプションです。
ただし、-d <action>
が役立つ場合があります。
-d
のいいところは、現在のレベルをスキャンしたいだけのときに「grep:directory_name:Is a directory」を表示しないskipコマンドです。
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
そしてもちろん:
$ grep -d recurse foo *
(list of results that don't exist because the Word foo isn't in our source code
and I wouldn't publish it anyway).
$
-d skip
オプションは別のスクリプト内で本当に便利なので、2> /dev/null
を使用する必要はありません。 :)
多くのファイルを処理している場合、サブフォルダー内のすべてのファイルをgrepするのではなく、検索する必要があるファイルを削除すると、grepの実行が速くなります。
私は時々このフォーマットを使用します:
grep "primary" `find . | grep cpp$`
cpp
で終わる.
のサブフォルダー内のすべてのファイルを検索します。次に、これらのファイルを「プライマリ」にgrepします。
必要に応じて、これらの結果をさらにgrep呼び出しにパイプすることができます。
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"