サイトアイコン IT NEWS

Linuxでディレクトリ配下のファイル内を再帰的に検索する方法

以前記事にした、PHPの拡張モジュールでエラーが発生した際に、Linuxコマンドを使って一括で複数のファイルの内容を検索したいと思ったことがあります。
有識者なら何となくfindコマンドを使うのはわかると思いますが、今回は特定のディレクトリ配下のファイル内を再帰的検索する方法についてご紹介します!

findとgrepコマンドで再帰的にファイル内を検索

まずは、ファイル検索する際によく利用するfindコマンドですが、これだけではファイル名しか検索できません。
指定したディレクトリ配下にある特定のファイル名再帰的検索し、検索結果を利用してgrepコマンドファイル内を検索します。
それでは以下を参考に少しずつ解説していきましょう。

findコマンドで再帰的に検索

まずは、特定のディレクトリ配下にある指定の拡張子のファイルを、findコマンド-nameオプションを使って再帰的検索してみます。
基本的な使い方はこんな感じ。

find <検索ディレクトリ> -name '<検索文字列>'

これを使ってPHPの設定ファイルである.iniファイルを、インストールディレクトリ内で再帰的検索してみます。

# find /etc/php/7.4/ -name '*.ini'
/etc/php/7.4/cli/php.ini
/etc/php/7.4/cli/conf.d/10-mysqlnd.ini
/etc/php/7.4/cli/conf.d/10-opcache.ini
/etc/php/7.4/cli/conf.d/10-pdo.ini
/etc/php/7.4/cli/conf.d/15-xml.ini
/etc/php/7.4/cli/conf.d/20-bcmath.ini
/etc/php/7.4/cli/conf.d/20-calendar.ini
/etc/php/7.4/cli/conf.d/20-ctype.ini
/etc/php/7.4/cli/conf.d/20-curl.ini
・・・

すると、.iniを含む全ファイルが表示されるはずです。

xargsコマンドで実行結果を引数にする

次に、findコマンドの後に「|パイプ)」でxargsコマンドを繋げることで、上記の出力結果を次のコマンドの引数として利用することできます。

# find /etc/php/7.4/ -name '*.ini' | xargs <コマンド>

つまり、findコマンドで出力したファイルパスを、次のコマンドで利用できるわけです。
これを踏まえて、さらに次のgrepコマンドfindで出力したファイルの中身を検索します。

grepコマンドでファイル内を検索

最後に、findコマンドで出力されたファイルに対して、grepコマンド検索をします。
grepコマンドの基本的な使い方は以下の通りです。

# find /etc/php/7.4/ -name '*.ini' | xargs grep <検索文字列> <ファイルパス>

ファイルパスについては、先程のxargsコマンドで引数として引き継がれていますので、検索する文字列を指定してあげればOK!
また、grepコマンドのメリットは正規表現が使えて、より精度の高い検索ができることです。
grepコマンドの詳しい説明やオプションについては、以下を参考にしてください。

正規表現の使用例についてはこちらから。

【まとめ】完成例

それでは、一連のコマンドを繋げて特定のディレクトリ配下にあるファイルの内容を再帰的に検索します!
以下の完成例では、/etc/php/7.4/配下にある全ての.iniファイルから、「extension=curl」という文字列検索しています。

完成例
# find /etc/php/7.4/ -name '*.ini' | xargs grep extension=curl
/etc/php/7.4/cli/php.ini:;extension=curl
/etc/php/7.4/cli/conf.d/20-curl.ini:extension=curl.so
/etc/php/7.4/mods-available/curl.ini:extension=curl.so
/etc/php/7.4/apache2/php.ini:;extension=curl
/etc/php/7.4/apache2/conf.d/20-curl.ini:extension=curl.so
/etc/php/7.4/cgi/php.ini:;extension=curl
/etc/php/7.4/cgi/conf.d/20-curl.ini:extension=curl.so
/etc/php/7.4/fpm/php.ini:;extension=curl
/etc/php/7.4/fpm/conf.d/20-curl.ini:extension=curl.so

サクラエディタのgrepを使っている感じですね。
慣れてしまえば、GUIで検索するよりも早いのではないでしょうか。

著:うすだ ひさし
¥2,475 (2023/01/03 09:24時点 | Amazon調べ)
\楽天ポイント5倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

モバイルバージョンを終了