在 Linux 运维和开发中,大多数新手可能遇到过这种情况:从 Windows 拷贝到 Linux 的文本文件(如脚本、配置文件),执行时提示 "语法错误"或"找不到命令",或用 cat -A 查看时末尾全是 ^M,这是换行符格式不兼容:Windows 用 \r\n(CRLF),Linux 用 \n(LF)。而这篇文章介绍下专门解决这个问题的 “神器”:dos2unix 。一键将 Windows/DOS 格式的文本文件,转换成 Linux/Unix 格式,彻底消除换行符导致的各种坑。- DOS/Windows:换行符 = 回车(CR,\r)+ 换行(LF,\n),即 \r\n(显示为 ^M);
- Linux/Unix/MacOS(新版):换行符 = 仅换行(LF,\n);
- 旧版 MacOS:换行符 = 仅回车(CR,\r)。
当 Linux 读取 Windows 格式文件时,会把 \r 识别为无效字符(^M):- 脚本文件:^M 会被解析成命令的一部分,导致 “命令未找到”;
dos2unix 的核心作用:删除文件中的 \r 字符,只保留 \n,让文件符合 Linux 格式规范。dos2unix [OPTION]... FILE...
例如,将 file.txt 从 DOS 格式转换为 Unix 格式:该命令会直接修改 file.txt,将其转换为 Unix 格式。- -c 或 --converters:指定转换类型。dos2unix 支持多种字符集转换,可以指定不同的字符集进行转换(例如 ISO-8859-1、UTF-8 等)。
dos2unix -c iso-8859-1 file.txt
- -n 或 --newfile:将转换后的文件保存为另一个文件,避免覆盖原文件。
dos2unix -n file.txt newfile.txt
这会将 file.txt 转换为 Unix 格式并保存为 newfile.txt,而不影响原文件。- -i 或 --input:处理输入文件时忽略转换中的某些问题。
- -o 或 --output:控制输出的行结束符格式。例如,强制转换为 \r\n 结束符,或者指定其它特定的格式。
- -q 或 --quiet:禁用输出,只有在出错时才显示信息。
- -v 或 --version:显示 dos2unix 的版本信息。
- -h 或 --help:显示帮助信息,列出所有可用选项。
如果你有一个名为 dosfile.txt 的文件,其中包含 Windows 格式的行结束符,可以通过以下命令将其转换为 Unix 格式:此命令会直接修改 dosfile.txt 文件,使其变为 Unix 格式。如果有多个文件需要转换,你可以一次性转换多个文件:dos2unix file1.txt file2.txt file3.txt
这样会同时将 file1.txt、file2.txt 和 file3.txt 从 DOS 格式转换为 Unix 格式。如果你不想覆盖原文件,可以使用 -n 选项将转换后的文件保存为新文件:dos2unix -n dosfile.txt unixfile.txt
这个命令将 dosfile.txt 转换为 Unix 格式,并将转换后的内容保存为 unixfile.txt,而不修改原文件。如果你希望在转换过程中看到详细信息,可以使用 -v 选项:- unix2dos:将 Unix 格式的文本文件转换为 DOS 格式(即将每行的 \n 转换为 \r\n)。
- dos2unix:将 DOS 格式的文本文件转换为 Unix 格式(即将每行的 \r\n 转换为 \n)。
这些命令在不同操作系统之间进行文本文件格式转换时非常有用,尤其是在跨平台开发和迁移过程中。如果你需要在脚本中自动执行文件格式转换,可以这样使用 dos2unix:#!/bin/bash# 自动将所有文件转换为 Unix 格式for file in *.txt; do dos2unix "$file"done
这个脚本将目录下所有 .txt 文件转换为 Unix 格式。- dos2unix 核心作用:删除 Windows 文件中的 \r 字符,将 CRLF 换行符转为 Linux 的 LF,解决跨系统文本格式问题;
- 高频用法:dos2unix 文件名(直接转换)、dos2unix -n 源文件 目标文件(保留原文件)、dos2unix -r 目录(递归批量转换);
- 避坑关键:仅转换纯文本文件,中文乱码需先转编码,无工具时用 sed/tr/vim 应急;
- 反向转换用 unix2dos,用法和 dos2unix 完全一致。
dos2unix 是 Linux 处理跨平台文本文件的基础工具,掌握它能避免绝大多数因换行符导致的脚本执行失败、配置错误等问题,是运维 / 开发必学的小工具。