MovableType Perlのパスを一括変換

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.