Gazelle
2020年07月01日更新 23732 Views

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が使われている事がわかる。

WindowsLinux/Mac OSX
改行コードCRLFLF
表示文字\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というプラグインを導入しよう。
image.png
導入後歯車マーク=>settingsと進み、ファイルを開く絵文字をクリックするとsettings.jsonファイルを開くことができる。
image.png
ここで、

"editor.renderControlCharacters": true

を追加してやると、すぐさま改行コードを可視化することができる。こんな感じ。
image.png
これで本当に改行コードが変わったのか確かめることができる。めでたしめでたし。

関連記事

ps axuをして全プロセスを表示し、該当するpidを指定してkillすれば良いという話
2020年03月18日
Railsアプリの独自ドメイン取得からSSL設定まで一貫して行います。環境はCentOS7、サーバはNginx、SSL化には無料のLet's Encryptを使用。
2020年03月18日
さくらVPSでコマンドが何故か重くなった時に、コンソールのCPU使用時間やtopコマンドでのCPU使用率を調査して原因を特定し、不要プロセスを終了させようという話。
2020年04月03日
node用version管理ツールnvmをインストールして、任意のnode versionを使う方法を解説
2020年07月30日
cronがうまく動かせない時はbashファイルの読み込み、実行ユーザ、相対パスの起点について疑ってみると大体動くようになるという話
2020年10月17日
Linuxのsedコマンドを使えば、簡単にファイル内の置換を行うことができる。正規表現のスラッシュ区切りを使わずにバーティカルバーを使って簡潔に書くことも可読性を高めるうえでは重要なテクニックとなる。
2021年07月07日
何度も使うHTMLタグをショートカットで簡単に呼び出して効率化するためのVSCodeのテクニック
2022年03月13日
ホームへ戻る