でfind
:
cd /the/dir
find . -type f -exec grep pattern {} +
(通常のファイル-type f
のみを検索します(通常のファイルを指す場合でもシンボリックリンクも除外します)。ディレクトリ以外の任意のタイプのファイルを検索する場合(ただし、fifosや/ dev / zeroなどのファイルのタイプがあることに注意してください)通常は読みたくない)、-type f
GNU固有のものに置き換えます! -xtype d
(シンボリックリンク解決後-xtype d
のタイプがディレクトリのファイルに一致します)。
GNUの場合grep
:
grep -r pattern /the/dir
(ただし、GNU grepの最新バージョンをお持ちでない限り、ディレクトリに降りたときにシンボリックリンクをたどることに注意してください)。-D read
オプションを追加しない限り、非正規ファイルは検索されません。grep
ただし、GNUの最近のバージョンでは、まだシンボリックリンク内を検索しません。
GNUの非常に古いバージョンはfind
標準{} +
構文をサポートしていませんでしたが、非標準を使用できます。
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
パフォーマンスはI / Oバウンドになりがちです。つまり、検索を実行する時間は、ストレージからすべてのデータを読み取るのに必要な時間です。
データが冗長ディスクアレイ上にある場合、一度に複数のファイルを読み取るとパフォーマンスが向上する可能性があります(そうでない場合は低下する可能性があります)。パフォーマンスがI / Oに制限されていない場合(たとえば、すべてのデータがキャッシュにあるため)、複数のCPUがある場合は、並行処理greps
も役立つ可能性があります。GNU xargs
の-P
オプションでそれを行うことができます。
たとえば、データが3つのドライブを備えたRAID1アレイ上にある場合、またはデータがキャッシュ内にあり、CPUが3つあり、時間に余裕がある場合:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(ここでは、1000ファイルごとに-n1000
新しいgrep
ファイルを生成するために使用します。最大3つまで同時に実行されます)。
ただし、の出力grep
がリダイレクトgrep
される場合、3つのプロセスからのインターリーブが不適切に出力されることに注意してください。この場合、次のように実行できます。
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(最新のGNUまたはFreeBSDシステムで)または--line-buffered
GNU のオプションを使用しますgrep
。
pattern
が固定文字列の場合、-F
オプションを追加すると問題が改善される可能性があります。
マルチバイト文字データでない場合、またはそのパターンのマッチングの場合、データがマルチバイト文字であるかどうかは関係ありません。
cd /the/dir &&
LC_ALL=C grep -r pattern .
パフォーマンスを大幅に改善できます。
そのような検索を頻繁に行うことになった場合、そこにある多くの検索エンジンの1つを使用してデータのインデックスを作成することができます。
find
してxargs
やgrep -R