改行コードを一括で置換する

定期的に使うのでメモ。

Linuxサーバー上で対象ディレクトリ配下のファイルの文字コードを一括で置換するコマンドです。
以下コマンドで現ディレクトリ配下にあるphpファイルに対してCRLF(\r\n)をLF(\n)に置換します。

sudo find . -name "*.php" -type f -exec sed -i -e "s/\r//g" {} \;

※sudoは必要に応じて。全対象ファイルの編集権限があるなら不要です。

一応解説

CRLFはWindows等でよく使われる改行コードで、LFやLinuxやUnix等でよく使われる改行コードです。

まず、findコマンドの構成は以下の通り。

find {検索対象ディレクトリ} -name {検索対象の名前} -type {検索対象のタイプ} -exec {検索対象に対して実施するコマンド}

-type fでファイルを対象にしています。
-name "*.php"でphpファイルを指定しているのでタイプは指定する必要が内容に思えますが、
やろうと思えばhoge.phpというディレクトリも作れない訳ではないので、念の為指定しています。

そして、-execオプションでsedコマンドを指定しています。
sedコマンドの構成は以下の通り。

sed -i -e "s/{置換対象の文字列}/{置換後の文字列}/g" 対象ファイル

CRLFをLFに置換すると言いましたが、このコマンドでは正確にはCR(\r)を消しているだけです。
なので、CRLFはLFになりますし、もしCRがあれば消滅します。
(古いMacintoshではCRを改行コードとして扱っていたらしい。とりあえず現在では消滅してくれて良い。)

findの-execで実行する場合、{}に検索結果のファイル名が入ります。
そして実行したいコマンドの最後は\で閉じます。