カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

findとgrepを使ってファイルの中身を一括検索と置換

この記事は最終更新日から1年以上経過しています。

ホームページを制作していて、基幹に関わるファイル名等を変更したとき、サーバーにあるファイルのどのファイルから読み込まれているかを全て把握した上で変更しないといけないですよね。

小規模なサイトであれば問題はありませんが、大規模なサイトになると難しいこともあるでしょう。

これはサーバーが直接操作できる、もしくはsshでログインできる場合に限られますが、便利な方法をご紹介します。

findとgrepのコマンドを組み合わせてファイル内に該当ファイル名が記述されているファイルを探します。
例として「example.js」というファイルが読み込まれているhtmlファイルを探します。

find / -name '*.html' -type f | xargs grep -l 'example.js'

findコマンドのほうは、第1引数に探すディレクトリ(この場合ルート)、-nameオプションでファイル名を絞り込んでいます。
-type fは通常のファイルを指定しています。※シンボリックリンク等含まれない

grepコマンドのほうですが、-lオプションが見つかったファイル名だけを列挙するオプションとなります。
何も指定しないと見つかった行の内容も出力されるので、-lオプションを指定するよりも遅いです。

また大文字小文字を区別しない場合は、grep -lの後に-iを付けます。

パイプの後にxargsとあるのは、見つかったファイルの中身をgrepでチェックするためです。
これがないとファイル名をgrepしてしまいます。

ディレクトリは再帰的に探してくれるので、指定したディレクトリ以下の全てのファイルをチェックできます。

また、検索した文字列を一括で置換する場合には以下のようにします。

find / -name '*.html' -type f | xargs grep -l 'example.js' | xargs perl -p -i -e 's/example.js/exam.js/g'

perlコマンドのオプションについて
-pは入力データ各行毎に処理して出力します。
-iは入力ファイルを処理結果で上書きします。
-e、実行するスクリプトの内容を指定します。
ここでは「s/置換前/置換後/g」のスクリプトを使います。
gスイッチを付け加えることでマッチしたもの全てを置換してくれます。
iスイッチを付け加えると大文字小文字の区別をしません。

この記事がお役に立ちましたらシェアお願いします
4,576 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です