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

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

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

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

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

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

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

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

4,565 views

複数ファイル内の文字列を置換して上書き保存する

【ファイル内の文字列を置換して上書き保存する】
書式
perl -p -i -e ‘s/検索文字列/置換文字列/g’ 対象ファイル名

-p…入力ファイルから1行ずつ取り出して処理し、表示する。
-i…ファイルを修正する。拡張子を指定すると、その拡張子でバックアップを取ってくれます。
-e…直後に続く部分をスクリプトとして処理する。
s/検索文字列/置換文字列/g…文字列の置換。検索文字列を置換文字列に置き換える。最後の「g」(gスイッチ)を指定すると、1行に複数検索文字列がある場合、全て置換してくれる。なければ最初の1個だけ置換。

【複数ファイル内の文字列を置換して上書き保存する】
書式
find [検索開始ディレクトリ] [オプション] -exec perl -p -i -e ‘s/検索文字列/置換文字列/g’ {} \;

例1)

find . -type f -exec perl -p -i -e 's/test/test/g' {} \;

例2)拡張子等を限定するとき

find ./*.txt -type f -exec perl -p -i -e 's/test/test/g' {} \;

例3)指定したディレクトリ以下をすべて置き換えしたいとき

find . -name '*.txt' -type f -exec perl -p -i -e 's/test/test/g' {} \;

としたいところですが、これだとfindで検索対象のテキストファイルの更新日付が全て新しくなってしまいました。
正解は以下になります。

find . -name '*.txt' -type f | xargs grep -l 'test' | xargs perl -p -i -e 's/test/test/g'

拡張子を限定しないと、JPGやGIFファイルのバイナリファイルでもなんでもアクセスしてしまうので注意すべし。
詳しくはこちら→[findとgrepを使ってファイルの中身を一括検索と置換]

4,092 views

fgrep – ファイル内から文字列を検索する

-f <ファイル名>ファイル内から文字列を検索する
-i 大文字・小文字を区別しない
-n 各行の前に、ファイル内におけるその行の相対行番号を付けます。
-q エラーを出力しない
-R ディレクトリを再帰的に検索する。(使用できない場合あり)
-v 指定されたパターンと一致する行を除くすべての行を表示します。
-w ワードを探す
-x 完全一致する行のみを探す

例)

fgrep -iqw [検索文字列] -f <ファイル名>

-iqfwとするとファイル名がwだと認識するのでfオプションは最後に記述する

3,484 views