find -exec で sedで置き換えをすればいいのだが、sedの実装によって -i オプションの動作が異なるのでちょっとはまった。
Linux(GNU sed)の場合
バックアップを作成しない場合
$ find . -name "*.cgi" -exec sed -i 's/\/usr\/bin\/perl/\/usr\/local\/bin\/perl/' {} \;
バックアップを作成する場合は、-iに拡張子を指定。
$ find . -name "*.cgi" -exec sed -i.bak 's/\/usr\/bin\/perl/\/usr\/local\/bin\/perl/' {} \;
Mac OS X(BSD sed)の場合
Mac OS X のsedは、-i オプションに引数(バックアップファイルの拡張子)の指定が必須なので、-iに何も指定しないと、
sed: 1: "./mt-add-notify.cgi": invalid command code . sed: 1: "./mt-atom.cgi": invalid command code . sed: 1: "./mt-check.cgi": invalid command code . ...
というエラーになってしまう。
なので、バックアップを作成しない場合は、-i ''を指定する。
$ find . -name "*.cgi" -exec sed -i '' 's/\/usr\/bin\/perl/\/opt\/local\/bin\/perl/' {} \;
バックアップを作成する場合は、
$ find . -name "*.cgi" -exec sed -i '.bak' 's/\/usr\/bin\/perl/\/opt\/local\/bin\/perl/' {} \;
MovableType Perlのパスを一括変換:Jays Room.
Sed: ‘sed: 1: invalid command code R’ on Mac OS X at Mark Needham.