使用しているツリー全体で何かを検索したいとき
find . -type f -print0 | xargs -0 grep <search_string>
パフォーマンスや単純さの点でこれを行うより良い方法はありますか?
答え1
grep
オプションがサポートされていることを確認してください-r
(例:再帰):
grep -r <search_string> .
答え2
サブディレクトリに再帰的に移動するには、次の手順を実行します。
grep -R 'pattern' .
この-R
オプションは標準ではありませんが、grep
ほとんどの一般的な実装でサポートされています。
答え3
find
2番目に良い答え:出力をパイプで接続する代わりに、次のことを実行できます。grep
find . -type f -exec grep 'research' {} '+'
チャジャン、二つではなく一つの命令ですね!
説明する:
find . -type f
ですべての一般的なファイルを探します。
-exec grep 'research'
grep '研究'
{}
見つかったファイル名に
'+'
各ファイル名に対して 1 回ではなく、すべてのファイル名に対して 1 つのコマンドを使用します。
注:';'
各ファイル名は一度に表示されます。
それ以外にも、ソースコードの操作に使用している場合は、ack
コードの一部を簡単に見つけるために設計されたコードを表示できます。
編集する:
この研究をもう少し拡張できます。まず-name ''
、スイッチを使用して、指定されたfind
命名パターンを持つファイルを見つけることができます。
たとえば、
ログに固有のファイル:
-name '*.log'
cヘッダーを持つファイルにのみ対応しますが、ファイル拡張子は大文字または小文字に固執することはできません。
-iname *.c
注:と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
答え4
多数のファイルで作業している場合は、サブフォルダ内のすべてのファイルをgrepingするのではなく、検索する必要があるファイルを切り捨てると、grepがより速く実行されます。
私は時々次の形式を使用します。
grep "primary" `find . | grep cpp$`
.
.txtで終わるサブフォルダ内のすべてのファイルを見つけますcpp
。次に、「基本」を見つけるためにそのファイルをgrepします。
必要に応じて、これらの結果を追加のgrep呼び出しに引き続き渡すことができます。
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"