Windowsの改行コードCRLFを一括でUnixのLFに置き換える
- 結論:下記のコードを変更したいディレクトリで叩け
find . -type f | xargs nkf -Lu --overwrite
より詳しい説明が欲しい人や、可視化して安心して変更したい場合はこの記事を最後まで読んで欲しい。それでは記事開始↓
たまに改行コードが揃っていないせいで、gitにpushした時にconflictが起きたりとか、テストで死んでいたとか良からぬ不具合に遭遇する可能性があるので確実にそろえておくべきである。
ところがWindowsとLinuxで改行コードが異なるため、WindowsPCで作業をしていてLinuxに作業環境を移す時や、remoteのLinuxサーバにgitのpushを行う時に意図せず改行コードが変わってしまっている事が時にある。
よって意図せぬ改行コードが入ってしまった時にはそれをもと通りにしてやる必要がある。
od -c コマンドやfileコマンドにより改行コードを判別
まずは自分のファイルの改行コードが何かを調べてやる必要がある。これにはod -c
が便利である。
$man od
NAME
od - dump files in octal and other formats
...
-c same as -t c, select printable characters or backslash escapes
ようはコードを8進数に変換し、それを文字列やバックスラッシュで表示してくれるというコマンドである。octal dumpでオクトは8を表す。オクトパスで8を意味することは分かるだろう。これに対してファイルを指定すると下記のように出力してくれる。
$ od -c package.json
0000000 { \n " n a m e " : " k a b
0000020 u s o n " , \n " v e r s i o
0000040 n " : " 1 . 0 . 0 " , \n "
0000060 d e s c r i p t i o n " : " "
0000100 , \n " m a i n " : " g u l
0000120 p f i l e . j s " , \n " d e
\n
があるので、これはLFが使われている事がわかる。
Windows | Linux/Mac OSX | |
---|---|---|
改行コード | CRLF | LF |
表示文字 | \r\n | \n |
より簡単にはfileコマンドが便利
可視性という観点ではオクトダンプより低いかもしれないが、fileコマンド
がより単純に改行コードを調べられる。例えば手持ちのファイルで試すと次のようになる
$ file index.ejs
index.ejs: exported SGML document, UTF-8 Unicode text, with CRLF line terminators
SGMLはStandard Generalized Markup Languageの略でHTMLのようなマークアップ言語であること、UTF-8でエンコードされたテキストであること、CRLFの改行コードが使われているということが分かる。仮に改行コードをLFに変更すると次のようにwith CRLF line terminatorsが消える。
$ file index.ejs
index.ejs: exported SGML document, UTF-8 Unicode text
WindowsでCRLFを一括してLFに置き換えるためnkfコマンドを使う
Windowsで改行コードを置き換えるのはnkfコマンドを使えば一発である。nkfはnetwork kanji filterの略で、ネットワーク上を流れる文字の文字コード及び改行コードを変換してくれるコマンドである。何故漢字フィルターかという由来は良く分からない。
ところがnkfコマンドはWindowsの初期コマンドとしては入っていないのでWSL(Windows Subsystem For Linux)を使用する必要がある。
ちなみにnkfコマンドをWindowsへインストールすることもできるが、環境変数の設定など面倒でかつ、chocolateyというパッケージ管理ツールでもサポートされていなかったため後々管理がめんどうだなと思いあきらめた。
UbuntuをWSLで落としてきて、
sudo apt-get install nkf
をすれば入れることができる。
このコマンドを使い先ほどのindex.ejs
を次のようにしてLFのUnix形式に変更することができる。
nkf -Lu --overwrite index.ejs
LはLine BreakのL、uはUnixのuである。すなわち改行コードをUnix形式のLFに書き換えてoverwrite(上書き)するという意味である。覚えやすい。元のWindows形式のCRLFに戻す時は
nkf -Lw --overwrite index.ejs
である。wは当然のことWindowsのwである。
ディレクトリ以下まとめて変換
もし複数のファイルを一括して変換してやりたい時は以下のコマンドを打てばよい。
find . -type f | xargs nkf -Lu --overwrite
ディレクトリ以下のファイルを全て探してきて、xargsを用い、そのそれぞれに対して先ほどの改行コード変換コマンドをかけてやる。これで全ファイルを一発でUnixファイル形式に変えることができる。
【番外編】VSCodeで文字コードを可視化する
改行コードを変更できたは良いが、本当に変わっているのか?という疑問はあると思う。VSCodeで文字コードを可視化する方法を教えておこう。
まずはVSCodeの左下にある歯車マークからextentionsを選び、line-endingというプラグインを導入しよう。
導入後歯車マーク=>settingsと進み、ファイルを開く絵文字をクリックするとsettings.jsonファイルを開くことができる。
ここで、
"editor.renderControlCharacters": true
を追加してやると、すぐさま改行コードを可視化することができる。こんな感じ。
これで本当に改行コードが変わったのか確かめることができる。めでたしめでたし。