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 -2M
2MB 未満のファイルを表します。-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つをお勧めします。
ルートで検索するのではなく、便利な部分だけを検索してください。
/home
またはそれぞれを検索してください/usr
。/etc
あなたが探している情報は特定の種類である可能性があるため、特定のフォルダに配置できます。構成設定はにある必要があります/etc
。個人データファイルはになければなりません/home
。このような主要な領域に検索を制限すると、再帰的なgrepの問題が大幅に減少します。--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
検索テキストがファイルコンテンツのサブストリングであるファイルも検索する場合は、このオプションを無視してください。