以前記事にした、PHPの拡張モジュールでエラーが発生した際に、Linuxのコマンドを使って一括で複数のファイルの内容を検索したいと思ったことがあります。
有識者なら何となくfind
コマンドを使うのはわかると思いますが、今回は特定のディレクトリ配下のファイル内を再帰的に検索する方法についてご紹介します!
findとgrepコマンドで再帰的にファイル内を検索
まずは、ファイルを検索する際によく利用するfind
コマンドですが、これだけではファイル名しか検索できません。
指定したディレクトリ配下にある特定のファイル名を再帰的に検索し、検索結果を利用してgrep
コマンドでファイル内を検索します。
それでは以下を参考に少しずつ解説していきましょう。
findコマンドで再帰的に検索
まずは、特定のディレクトリ配下にある指定の拡張子のファイルを、find
コマンドと-name
オプションを使って再帰的に検索してみます。
基本的な使い方はこんな感じ。
1 |
find <検索ディレクトリ> -name '<検索文字列>' |
これを使ってPHPの設定ファイルである.ini
ファイルを、インストールディレクトリ内で再帰的に検索してみます。
1 2 3 4 5 6 7 8 9 10 11 |
# 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
コマンドを繋げることで、上記の出力結果を次のコマンドの引数として利用することできます。
1 |
# find /etc/php/7.4/ -name '*.ini' | xargs <コマンド> |
つまり、find
コマンドで出力したファイルパスを、次のコマンドで利用できるわけです。
これを踏まえて、さらに次のgrep
コマンドでfind
で出力したファイルの中身を検索します。
grepコマンドでファイル内を検索
最後に、find
コマンドで出力されたファイルに対して、grep
コマンドで検索をします。grep
コマンドの基本的な使い方は以下の通りです。
1 |
# find /etc/php/7.4/ -name '*.ini' | xargs grep <検索文字列> <ファイルパス> |
ファイルパスについては、先程のxargs
コマンドで引数として引き継がれていますので、検索する文字列を指定してあげればOK!
また、grep
コマンドのメリットは正規表現が使えて、より精度の高い検索ができることです。grep
コマンドの詳しい説明やオプションについては、以下を参考にしてください。
正規表現の使用例についてはこちらから。
【まとめ】完成例
それでは、一連のコマンドを繋げて特定のディレクトリ配下にあるファイルの内容を再帰的に検索します!
以下の完成例では、/etc/php/7.4/
配下にある全ての.ini
ファイルから、「extension=curl」という文字列を検索しています。
1 2 3 4 5 6 7 8 9 10 |
# 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で検索するよりも早いのではないでしょうか。
コメント