特定のディレクトリ以下のファイルを対象に文字列置換

railsアプリ内のある文字列を一気に置換したかったので、アプリのルートディレクトリで次のコマンドを実行しました。

$ grep -lr str_before ./ | grep -v '\.log' | xargs sed -i 's/str_before/str_after/g'
  # 置換前の文字列を含むファイルをすべて表示
                           # うち、置換不要なログファイル等を除外
                                             # 残りのファイルについて置換を実行



# 追記:2010/03/01

# str_beforeを二度書くのは面倒なので、変数にあてます。
$ str=str_before; grep -lr $str ./ | grep -v '\.log' | xargs sed -i 's/'$str'/str_after/g'

# なお、railsアプリであれば、rak という便利gemを使ってこう書けます。
$ str=str_before; rak -l $str | xargs sed -i 's/'$str'/str_after/g'
  • grep
    ファイル内の文字列を検索
    • -l ::パターンに一致した行を含むファイル名だけを出力
    • -r ::特定ディレクトリ以下を再帰的に検索
    • -v ::パターンに一致しない行を表示
  • xargs
    標準入力から複数の引数を読み込み、指定のコマンドを実行
  • sed
    文字列の置換
    • -i ::直接ファイルの内容を置換