Linuxシステム全体をスキャンして、特定の文字列を含むすべてのファイルを探す方法を探しています。念のため、ファイル名ではなく、ファイル内の文字列を探しています。
この方法を調べているときに、この解決策に2度出会いました。
find / -type f -exec grep -H 'text-to-find-here' {} \;
しかし、これではうまくいきません。システム内のすべてのファイルが表示されてしまうようです。
これは適切な方法に近いでしょうか?もしそうでなければ,どのようにすればよいのでしょうか?ファイルの中のテキスト文字列を見つけることができれば,私がやっているプログラミングプロジェクトでは非常に便利です。
次のようにしてください。
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
または -R
は再帰的です。-n
は行番号、そして-w
は単語全体にマッチすることを表します。-l
(小文字のL)を追加すると、マッチしたファイルのファイル名だけを与えることができます。これらに加えて、--exclude
, --include
, --exclude-dir
フラグを使えば、効率的な検索が可能になります。
これは、拡張子が.cまたは.hのファイルのみを検索します。
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
この場合、拡張子が.oで終わるファイルはすべて検索から除外されます。
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
ディレクトリの場合、--exclude-dir
パラメータで特定のディレクトリを除外することができます。例えば、dir1/, dir2/と、*.dst/に一致するすべてのディレクトリを除外することができます。
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
この方法は私にとって非常に有効で、あなたの目的とほぼ同じ目的を達成することができます。
その他のオプションについては man grep
を参照してください。