コピペ用コマンド #
解説は不要という方は、以下のコマンドをそのコピー頂きご利用ください。
find 検索開始パス -type f -print0 2>/dev/null | xargs -0 grep -Hn "検索したい文字列"
初めに #
サーバー管理やログ調査をしていると「この文字列を含むファイルはどこにあるんだろう?」と思うことはありませんか?
本記事では、findコマンドでファイルの中身(内容)を検索する方法をご紹介します。
記載のコマンドはすべてコピー&ペースト可能な形式で記載しておりますので
findでファイルの中身を検索する #
基本コマンド #
findコマンドとgrepコマンドを組み合わせることで、指定したパス以下にある全てのファイルから特定の文字列を検索する事ができます。
基本となるコマンドは次の通りです。
find 検索開始パス -type f -print0 2>/dev/null | xargs -0 grep -Hn "検索したい文字列"
例として、現在のディレクトリ以下から「example」という文字列を探したい場合は次のように実行します。
find . -type f -print0 2>/dev/null | xargs -0 grep -Hn "example"
以下は実行例となります。
[test@localhost test]$ find . -type f -print0 2>/dev/null | xargs -0 grep -Hn "example"
./test.txt:1:example
コマンド解説 #
以下はfindコマンドにて中身を検索する際の処理の流れとなります。
1.findコマンドにてファイル内容を出力 2.上記結果をxargsコマンドを利用しgrepへ引き渡す 3.grepコマンドにて絞り込み処理を実施 4.結果出力
以下は各コマンドの詳細解説となります。
コマンド構成要素 | 説明 |
---|---|
find 検索開始パス |
ファイル検索を開始する起点ディレクトリを指定します。 例: . は現在のディレクトリ配下。 |
-type f |
通常ファイルのみを検索対象にします。 ディレクトリや特殊ファイルを除外し、grep時のエラーを防止します。 |
-print0 |
各ファイル名の末尾にヌル文字(\0 )を付加して出力。空白や改行を含むファイル名でも処理できるようにします。 |
2>/dev/null |
権限のないファイルで発生する Permission denied を非表示にし出力結果を見やすくします。 |
` | `(パイプ) |
xargs -0 |
ヌル文字区切りの入力(-print0 )を正確に受け取り、ファイル名の安全な受け渡しを行います。 |
grep -Hn "検索したい文字列" |
渡されたファイル群の中から文字列を検索。-H でファイル名を出力-n で検索単語に該当した行番号を表示します。 |
エラー抑止 #
ファイル名に空白や改行、記号などが含まれている場合、よく見かける find
と xargs
のシンプルな構成では、正しく処理されないことがあります。
こうしたトラブルを防ぐには、今回ご紹介している -print0
と xargs -0
のセット利用がとても効果的です。
たとえば my file.txt
のようなスペースを含むファイル名が存在する場合、xargs
コマンドはそれを my
と file.txt
に分けてしまい、検索対象から漏れたり、意図しないエラーが出る原因になります。
安全にコマンドを使いたい場合は、-print0
と xargs -0
を忘れずにご利用いただく事をお勧めいたします。
応用 #
基本コマンドに追加の条件を加えることで、より効率的な検索が可能となっています。
たとえば「ログファイル(.log
拡張子)だけに絞ってエラーという単語を探したい」という場合は、以下のように -name
オプションでファイル名パターンを指定する事ができます。
今回は例として検索パスをLinuxのログディレクトリである「/var/log
」配下を指定しています。
find /var/log -type f -name "*.log" -print0 2>/dev/null | xargs -0 grep -Hn "error"
このように -name
オプションに対し *.log
のようにワイルドカードを使うことで特定の拡張子のファイルだけを絞り込む事が可能です。
※ワイルドカードはシェルに解釈されないように、ダブルクォーテーションで囲む必要があります。
よくあるミスとエラーへの対処法 #
初心者の方が find+grep
検索を試す際に陥りがちなミスと、その対処法を以下にていくつか挙げます。
検索文字列に空白を含めたのにエラーが出る #
例えば grep -n foo bar
のように検索文字列にスペースを含めてしまうと、bar
をファイル名と誤認してエラーになります。
検索語句に空白が含まれる場合は、必ずダブルクオーテーション "
で囲むか、スペースをバックスラッシュでエスケープする必要があります。
Permission deniedと大量に表示される #
権限のないディレクトリを find
コマンドが検索巡回をすると「Permission denied(アクセス拒否)
」エラーが表示されます。
このような場合、コマンド例のように 2>/dev/null
を付けてエラー出力を抑制するか、検索開始パスを自分がアクセス可能なディレクトリに限定してください。
ワイルドカードがうまく機能しない #
find . -name *.txt
のようにクオートに囲まずに記述すると *.txt
が shell
によって先に展開され予期しない挙動となる場合があります。
このような場合は、必ず "*.txt"
のように引用符で囲んで指定しましょう。
-type fを忘れたためにエラーやノイズが出る #
-type f
を付けない場合、ディレクトリ自体もgrepの対象になり、エラーや意図しない特殊ファイルを読もうとし時間がかかる場合があります。
ファイルの中身を検索する場合は基本的に -type f
を指定し、ファイルのみに対象を絞るように処理してください。