Grepツールを使用する必要があると仮定して、ファイルシステム全体でテキスト文字列「800x600」を検索したいと思います。
私は試した:
grep -r 800x600 /
しかし、それは機能しません。
私のコマンドがすべきことは、ルートの下にあるすべてのファイル/フォルダーをテキスト「800x600」で再帰的にgrepし、検索結果を一覧表示することです。
何が悪いのですか?
私は通常、このスタイルのコマンドを使用して、多数のファイルに対して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
を見て、可能なフィルターの完全なリストを確認してください。
通常、実際にはシステム上のすべてを検索する必要はありません。 Linuxはすべてにファイルノードを使用するため、「ファイル」の中には検索したくないものもあります。たとえば、/dev/sda
は、最初のハードドライブの物理ブロックデバイスです。おそらくロー・ディスク・デバイスではなく、マウントされたファイル・システムを検索したいでしょう。また、/dev/random
があり、これを読み取るたびにランダムなデータが出力されます。それを検索することはあまり意味がありません。あなたの場合、/proc
ファイルシステムにも問題があります。
2つのうちの1つをお勧めします。
ルートではなく、役立つと思われる場所のみを検索してください。 /home
または/usr
または/etc
を個別に検索します。探している情報は特定のタイプである可能性が高いため、とにかく特定のフォルダにある可能性があります。構成設定は/etc
にする必要があります。個人データファイルは/home
にある必要があります。このような主要な領域に検索を制限すると、再帰的なグループの問題が大幅に減少します。
--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
それを見る別の方法はこの方法です:
grep -r /* | grep "800x600"
*その後、/ proc/sysrq-trigger:入出力エラーが発生します
コマンドが機能しています。実行中のプロセスで文字列をスキャンしようとしているため、このエラーが発生しています。
私はシステムディレクトリを除外することをお勧めします
grep -exclude-dir = {proc、sys} "800x600" /