findとかgrepとかを使って再帰置換など

再帰的な置換処理はPHPとかでループさせてできなくもないんだけど、サーバーサイドでやった方が軽い上に早いです。勿論ローカルにダウンロードして便利なソフトでやっても構わないんですが、それでも尚コマンドラインの方が相当に楽です。が、しかし結構変なところでいろいろ厄介。
数千ファイルを一括置換すると言ったらですよ、たいていhttpで始まるアンカーのところか、フルパス。この置換さえ覚えておけばだいたいOKでしょという感じです。正規表現でもっと複雑な置換をするなんてことは結構こわくてできないので変数で正規化しておきましょうね。

再帰的に置換する

やり方の順序としてはfindで目的のファイルを再帰的に舐めちゃう感じで。
find . -name '*.php'
この場合はphpファイルを検索しにいってますが全ファイル対象ならfind . -name '*'でいいんじゃないかと。またあるいはWEB系の仕事だったら、'*.html' '*.css' '*.js' '*.php' '*.yaml'とか何とかテキストファイルに限定しておけば処理速度は速いです。
で、それをパイプでxargs渡してやって、置換します。xargsは便利だ。
この例では、www.example.comをtest.example.comに一括置換です。ドットは正規表現のメタ文字とみなされるのでエスケープします。
find . -name '*.php' | xargs sed -i 's/test\.example\.com/test\.example\.com/g'
ただ、ここで問題になるのが処理系のところ。CentOSでは難なく動いた上記コードだけど、なぜだかFreeBSD上では全然動かないんですね。これ、-iオプションの後ろは元々ファイル指定するってことなので、
sed -i "" 's/test\.example\.com/test\.example\.com/g'
と、空のダブルクォーテーション入れないと駄目みたいです。これだとOS関係なくいろんなところで動いた。

SSHでリモートホスト側を再帰的に置換する

この全文置換をSSHにひっかけると更にエスケープがややこしい。
ssh user@example.com "find . -name '*.php' | xargs sed -i '' 's/\/home\/user\/www\//\/home\/user2\/www\//g'"