dos2unix – Windows/Mac形式の改行をUnix形式(LF)へ変換する

サブシェル・グルーピング 改行・空白処理

dos2unix はテキストファイルの改行コードを CRLF(DOS/Windows)CR(Mac 旧形式) から LF(Unix/Linux) に変換するコマンドです。UTF-8/UTF-16 などのエンコーディングや BOM の扱いにも対応します。日常では「Windows で作ったスクリプトを Linux で動かす前に整形」「混在した改行を一括修正」などで使います。(dos2unix.sourceforge.io)

構文(Syntax)

# 置換(インプレース。既定)
dos2unix [OPTIONS] FILE...

# 新しいファイルに書き出し(ペアで指定)
dos2unix -n INFILE OUTFILE [INFILE OUTFILE]...

# 標準入出力(フィルタとして利用)
dos2unix [OPTIONS] -O FILE1 FILE2 ... > OUTPUT
# または
dos2unix < in.txt > out.txt
  • 既定は インプレース変換-o, --oldfile)。
  • -nIN/OUT をペアで与える必要があります(ワイルドカード不可)。(manpages.debian.org)

主なオプション一覧

オプション説明使用例
-o, --oldfile FILE...既存ファイルをその場で変換(既定)。所有者/パーミッションを保持(Unix)。dos2unix -o script.sh (manpages.debian.org)
-n, --newfile IN OUT ...新しいファイルへ書き出し(IN/OUT をペアで)。dos2unix -n a.txt a.unix.txt (manpages.debian.org)
-k, --keepdate出力のタイムスタンプを入力と同じに保つ。dos2unix -k -o README.txt (manpages.debian.org)
-q, --quiet / -v, --verbose進捗や警告の抑制 / 追加情報表示。dos2unix -q file.txt (manpages.debian.org)
-f, --forceバイナリ判定でも強制変換。通常はスキップ(-s, --safe が既定)。dos2unix -f binlike.dat (manpages.debian.org)
-c, --convmode {ascii,7bit,iso,mac}変換モード(ascii=通常、7bit=上位ビット落とし、iso=DOS↔ISO-8859-1、mac=CR→LF)。dos2unix -c mac oldmac.txt (manpages.debian.org)
-b, --keep-bom入力に BOM があれば出力にも BOM を保持dos2unix -b utf8bom.txt (manpages.debian.org)
-r, --remove-bomBOM を除去(Unix 変換時の既定)。dos2unix -r utf8bom.txt (manpages.debian.org)
-m, --add-bom出力に BOM を付与(既定は UTF-8)。dos2unix -m file.txt (manpages.debian.org)
-u, --keep-utf16UTF-16 入力を UTF-16 のまま書き出す(BOM 付与)。dos2unix -u -n in.txt out.txt (manpages.debian.org)
-ul / -ubBOM の無い UTF-16 を LE/BE と仮定して処理。dos2unix -ul -n in.txt out.txt (manpages.debian.org)
-e, --add-eol最終行に改行が無ければ付加。dos2unix -e -o file.txt (manpages.debian.org)
-i[FLAGS], --info[=FLAGS]変換せず行末/文字種/BOM等の情報を表示(c=要変換のみ、b=BOM、d/u/m=各改行数、0=NUL 終端など)。dos2unix -ic *.txt (manpages.debian.org)
-O, --to-stdout標準出力へ書く(フィルタ動作、-oで復帰)。dos2unix -e -O a.txt b.txt > out.txt (manpages.debian.org)
-F/-R/-Sシンボリックリンク: 追従/置換/スキップ。dos2unix -F docs/* (manpages.debian.org)
-V, --version / -h, --helpバージョン/ヘルプ表示。dos2unix -V (manpages.debian.org)

BOM の既定: Unix 変換(dos2unix)は BOM を出力しないのが既定(-r)。-b で「入力に BOM があれば保持」、-m で常に付与。UTF-16 無 BOM の場合は -ul/-ub で仮定します。(manpages.debian.org)

実行例

Windows で作成したテキストをインプレースで変換

説明: 既存ファイルを書き換えて CRLF→LF にします。
コマンド:

dos2unix -o setup.sh

出力例(静かに成功。-v で詳細表示)

新しいファイルに書き出し(安全に元を残す)

説明: IN/OUT をペアで指定して保存先を分けます。
コマンド:

dos2unix -n readme.txt readme.lf.txt

(ワイルドカードは不可。複数はペアを並べます) (manpages.debian.org)

変換が必要なファイルだけを抽出して処理

説明: -ic要変換ファイルのみ列挙 → xargs に渡して一括変換。
コマンド:

find . -name '*.txt' -print0 | xargs -0 dos2unix -ic | xargs -0 dos2unix

-print0/-0 は空白や引用符を含む名前に対応) (manpages.debian.org)

Mac(旧) の CR 改行を LF に変換

説明: 古い Mac 形式(CR のみ)を LF に。
コマンド:

dos2unix -c mac oldmac.txt
# 同等: mac2unix oldmac.txt

(manpages.debian.org)

BOM を除去/付与する

説明: BOM を取り除く、または付ける。
コマンド:

dos2unix -r utf8bom.txt      # 除去(Unix変換の既定動作)
dos2unix -m utf8.txt         # 付与(UTF-8 BOM)

(manpages.debian.org)

エラー例:-n のペアを崩して実行

説明: -n で IN/OUT の数が奇数だとエラーになります。
コマンド:

dos2unix -n a.txt

出力例(例):

dos2unix: files must be specified in pairs for --newfile

対処: dos2unix -n a.txt a.lf.txt のように IN/OUT を必ずペアで指定。(manpages.debian.org)

関連コマンド

  • unix2dos : LF→CRLF に変換(逆方向)。BOM の扱いは -b/-r/-m に準拠。(manpages.debian.org)
  • mac2unix / unix2mac : 旧 Mac 形式(CR)との相互変換。(manpages.debian.org)
  • file : ファイル種別や BOM/エンコード検出に。
  • iconv : 文字コード変換(UTF-8 ↔ UTF-16 等)。(manpages.debian.org)
  • sed / tr : 簡易な改行置換の補助(例: tr -d '\r' など)。

備考

  • バイナリ安全: 既定でバイナリをスキップ-s)。誤検出は 100% 防げないため、確信がある場合のみ -f で強制。(manpages.debian.org)
  • UTF-16 の扱い: BOM が無い UTF-16 は自動判定できないため -ul/-ub で仮定が必要。UTF-16 を保持したい場合は -u。(manpages.debian.org)
  • 再帰処理: ディレクトリ配下の一括変換は find ... | xargs 例が実践的。PowerShell/Windows でも専用のループ例あり。(manpages.debian.org)
  • 所有者/権限の保持: Unix のインプレース変換では所有者・グループ・RW権を保持。保持できない場合は変換中止(--allow-chown で続行可)。(manpages.debian.org)
  • インストール: 多くのディストリでパッケージ dos2unix を提供。macOS では brew install dos2unix、Windows 向けバイナリもあります。(SourceForge)

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント