ファイルシステム全体でテキストを検索するには?

ファイルシステム全体でテキストを検索するには?

grepツールを使用し、ファイルシステム全体で「800x600」というテキスト文字列を検索するとします。

私は試した:

grep -r 800x600 /

しかし、うまくいきません。

私のコマンドが実行する必要があるのは、ルートの下のすべてのファイル/フォルダを繰り返しgrepして "800x600"テキストを見つけて検索結果を一覧表示することだと思います。

私は何が間違っていましたか?

答え1

私は通常、grep複数のファイルを実行するために次のスタイルのコマンドを使用します。

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

実際に行うことは、システム上のすべてのファイルをリストし、各ファイルに指定された引数とgrep各ファイル名を使用して実行することです。

この-xdevパラメーターは、他のファイルシステムを無視する必要があることを示します。これは特別なファイルシステムを避けるのに最適です。/procただし、通常のファイルシステムも無視します。たとえば、/homeフォルダが別のパーティションにある場合、検索されません。 - 言わなければなりませんfind / /home -xdev ...

-type fファイルだけを検索するという意味なので、ディレクトリ、デバイス、その他の特殊ファイルは無視されます(まだディレクトリに再帰してその中のファイルで実行されます。ディレクトリ自体では実行されないので、grepとにかく動作しません)grep。オプションは常に出力にファイル名を印刷するように指示-Hします。grep

findファイルのリストをフィルタリングするさまざまなオプションを許可します。たとえば、-name '*.txt'.txt で終わるファイルだけが処理されます。-size -2M2MB 未満のファイルを表します。-mtime -5過去5日以内に変更されたファイルを示します。一緒に結合するには、-a forを使用してください。そしてそして-oまたは'('括弧を使用して式')'をグループ化します(シェルが解釈されないように引用符で囲みます)。たとえば、

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

man find可能なフィルタの完全なリストを確認してください。

答え2

一般に、システムのすべてのコンテンツを実際に検索したくはありません。 Linuxはすべての操作にファイルノードを使用するため、一部の「ファイル」は検索したいターゲットではありません。たとえば、/dev/sda最初のハードドライブの物理ブロックデバイスです。 RAWディスクデバイスの代わりにマウントされたファイルシステムを検索できます。別の/dev/random方法は、読み取るたびにランダムにデータを出力することです。検索してみてもあまり意味がありません。あなたの場合、ファイルシステムにも問題があります/proc

私は2つのうちの1つをお勧めします。

  1. ルートで検索するのではなく、便利な部分だけを検索してください。/homeまたはそれぞれを検索してください/usr/etcあなたが探している情報は特定の種類である可能性があるため、特定のフォルダに配置できます。構成設定はにある必要があります/etc。個人データファイルはになければなりません/home。このような主要な領域に検索を制限すると、再帰的なgrepの問題が大幅に減少します。

  2. --exclude-dir次のように必要ではないことがわかっている一連の項目を使用して、問題領域を解決してください。
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

最後に、大規模な再帰 grep を実行するときに「許可拒否」エラーが発生することは珍しくありません。一般的な使用中は、ユーザーが一部のファイルを読み取ることができない場合があります。これは単なる奇妙なファイルであり、ハードドライブのRAWデバイスやフルprocファイルシステムなどでない限り、これらのエラーは無視できます。実際には、すべてのエラーを決して着陸しないようにコマンドラインから送信することでこれを行うことができます。

grep -r search_string /path 2> /dev/null

答え3

シンプルさのために提案しますack-grep。リンクは、ack-grepより良い選択であるいくつかの状況を示しています。

これを使用するには、インストール後に次の手順を実行します。

ack-grep pattern /

答え4

.txt特定の名前パターン(ファイルなど)に一致するファイルでのみ検索テキストを実行するには、次のようにします。

grep -rlw --include="*.txt" -e "text to search" path/to/dir

w検索テキストがファイルコンテンツのサブストリングであるファイルも検索する場合は、このオプションを無視してください。

関連情報