いくつかのコンテンツについてツリー全体を検索したいときは、
find . -type f -print0 | xargs -0 grep <search_string>
パフォーマンスまたは簡潔さの観点からこれを行うより良い方法はありますか?
いくつかのコンテンツについてツリー全体を検索したいときは、
find . -type f -print0 | xargs -0 grep <search_string>
パフォーマンスまたは簡潔さの観点からこれを行うより良い方法はありますか?
回答:
grep
サポート-r
オプション(再帰用)かどうかを確認します。
grep -r <search_string> .
--exclude-dir
パフォーマンスに対処するためのコメントを追加すると、勝者がいます!
grep
てください。ただし、最近のFreeBSDおよびLinuxディストリビューションではサポートされています。そして、なぜ--exclude-dir
ですか?木全体を検索するように依頼しませんでしたか?
--exclude-dir
は、サブツリーの一部が大きいが役に立たないため、私のユースケースでは実際に便利であり、パフォーマンスについて尋ねました...しかし、あなたは正しい、それは必要ではありません。
--exclude-dir
がGNU専用であることを追加する必要がありますgrep
。(-:
準最適な回答:の出力をfind
にパイプする代わりにgrep
、単に実行することができます
find . -type f -exec grep 'research' {} '+'
そして出来上がり、2つではなく1つのコマンド!
説明 :
find . -type f
内のすべての通常ファイルを検索します。
-exec grep 'research'
grep '研究'
{}
見つかったファイル名
'+'
ファイル名ごとに1回ではなく、すべてのファイル名ごとに1つのコマンドを使用します。
注:';'
ファイル名ごとに1回でした。
それ以外に、それを使用してソースコードを処理する場合ack
、コードビットを簡単に検索するために作成されたを調べることができます。
編集:
その研究を少し拡張することができます。まず、-name ''
スイッチを使用して、find
特定の命名パターンを持つファイルを検索できます。
例えば :
ログに対応するファイルのみ: -name '*.log'
cヘッダーに対応するファイルのみですが、ファイル名拡張子に大文字または小文字を使用することはできません。 -iname *.c
注:for 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
-name '*.log'
高速」のようなフィルターを使用することをお勧めします。
サブディレクトリに再帰する場合:
grep -R 'pattern' .
この-R
オプションは標準オプションではありませんが、ほとんどの一般的なgrep
実装でサポートされています。
-r
の代わりに、-R
GNU grepのが関係している時にシンボリックリンクをスキップする
grep
実装は再帰をキャッチしますが、私は思います。それ以外の場合は、「ツリー」の意味に依存します。
grep
すべきことではありません。ユーザーがディレクトリ構造にシンボリックリンクループを持っている場合、それはユーザーの問題です:-)
/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(-XIのように私をベビーシッターするツール(「AI」と呼ばれる奇妙な魔法を提供しない限り)。(-;
上記のように(-r
または-R
希望するシンボリックリンクの処理に応じて)クイックオプションです。
ただし-d <action>
、役に立つ場合があります。
良い点-d
はskipコマンドです。このコマンドは、現在のレベルをスキャンしたいときに「grep:directory_name:Is a directory」を黙らせます。
$ 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"