web-dev-qa-db-ja.com

ファイルシステム全体でテキストを検索する方法

Grepツールを使用する必要があると仮定して、ファイルシステム全体でテキスト文字列「800x600」を検索したいと思います。

私は試した:

grep -r 800x600 /

しかし、それは機能しません。

私のコマンドがすべきことは、ルートの下にあるすべてのファイル/フォルダーをテキスト「800x600」で再帰的にgrepし、検索結果を一覧表示することです。

何が悪いのですか?

56
Level1Coder

私は通常、このスタイルのコマンドを使用して、多数のファイルに対してgrepを実行します。

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

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

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

-type fはファイルのみを検索することを意味するため、ディレクトリ、デバイス、その他の特殊ファイルは無視されます(ディレクトリに再帰し、その中のファイルに対してgrepを実行します-grepはディレクトリ自体にありますが、これは機能しません)。また、grep-Hオプションは、常にファイル名を出力に出力するように指示します。

findは、ファイルのリストをフィルタリングするためのあらゆる種類のオプションを受け入れます。たとえば、-name '*.txt'は、.txtで終わるファイルのみを処理します。 -size -2Mは、2メガバイト未満のファイルを意味します。 -mtime -5は、過去5日間に変更されたファイルを意味します。これらを-aで結合してandと-oを使用してorを結合し、'('括弧')'を使用して式をグループ化します(引用符で囲んで、それらを解釈することからのシェル)。だから例えば:

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

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

68
Richard Downer

通常、実際にはシステム上のすべてを検索する必要はありません。 Linuxはすべてにファイルノードを使用するため、「ファイル」の中には検索したくないものもあります。たとえば、/dev/sdaは、最初のハードドライブの物理ブロックデバイスです。おそらくロー・ディスク・デバイスではなく、マウントされたファイル・システムを検索したいでしょう。また、/dev/randomがあり、これを読み取るたびにランダムなデータが出力されます。それを検索することはあまり意味がありません。あなたの場合、/procファイルシステムにも問題があります。

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

  1. ルートではなく、役立つと思われる場所のみを検索してください。 /homeまたは/usrまたは/etcを個別に検索します。探している情報は特定のタイプである可能性が高いため、とにかく特定のフォルダにある可能性があります。構成設定は/etcにする必要があります。個人データファイルは/homeにある必要があります。このような主要な領域に検索を制限すると、再帰的なグループの問題が大幅に減少します。

  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
15
Caleb

簡単にするために、私は ack-grep をお勧めします。リンクは、ack-grepがより良いオプションです。

使用するには、インストール後に:

ack-grep pattern /
3
bbaja42

それを見る別の方法はこの方法です:

grep -r /* | grep "800x600"
2
maniat1k

*その後、/ proc/sysrq-trigger:入出力エラーが発生します

コマンドが機能しています。実行中のプロセスで文字列をスキャンしようとしているため、このエラーが発生しています。

私はシステムディレクトリを除外することをお勧めします

grep -exclude-dir = {proc、sys} "800x600" /

0
Koffee