文章目录
- 0.运行编译脚本遇到问题:
- 方法 1:使用 `dos2unix`(推荐)
- 1. 安装 `dos2unix`
- 2. 递归转换整个目录
- 方法 2:使用 `sed`(无需安装额外工具)
- 方法 3:使用 `tr`(仅单文件,不推荐递归)
- 方法 4:Git 自动转换(适用于版本控制项目)
- 注意事项
- 总结
0.运行编译脚本遇到问题:
./build.sh: line 17: $‘\r’: command not found
要将整个文件夹内所有文件的换行符从 Windows(CRLF) 转换为 Unix(LF),可以使用以下方法:
方法 1:使用 dos2unix
(推荐)
1. 安装 dos2unix
# Ubuntu/Debian
sudo apt-get install dos2unix# CentOS/RHEL
sudo yum install dos2unix# macOS(通过 Homebrew)
brew install dos2unix
2. 递归转换整个目录
# 转换当前目录及子目录下所有文件
find . -type f -exec dos2unix {} \;
选项解释:
find . -type f
:查找当前目录及其子目录下的所有文件(-type f
)。-exec dos2unix {} \;
:对每个文件执行dos2unix
命令。
⚠️ 注意:
- 如果只想转换特定扩展名(如
.sh
、.txt
),可以加上-name
过滤:find . -type f -name "*.sh" -exec dos2unix {} \;
- 谨慎使用! 二进制文件(如
.png
、.exe
)会被损坏,建议先备份或排除非文本文件。
方法 2:使用 sed
(无需安装额外工具)
# 递归转换所有文件(包括子目录)
find . -type f -exec sed -i 's/\r$//' {} \;
选项解释:
sed -i 's/\r$//'
:直接修改文件(-i
),删除行尾的\r
(Windows 回车符)。
适用场景:
- 适用于大多数文本文件(如
.sh
、.py
、.c
、.txt
)。 - 避免对二进制文件使用(可能损坏文件)。
方法 3:使用 tr
(仅单文件,不推荐递归)
# 单文件转换
tr -d '\r' < input_file > output_file# 递归转换(结合 find)
find . -type f -exec sh -c 'tr -d "\r" < "{}" > "{}.tmp" && mv "{}.tmp" "{}"' \;
缺点:
- 效率较低,且需要临时文件([mv](file://e:\Project_Code\08_remove\mcu\driver\chip\ab159x\inc\hal_pmu_nvkey_struct.h#L361-L361) 操作)。
方法 4:Git 自动转换(适用于版本控制项目)
如果文件在 Git 仓库中,可以配置 Git 自动处理换行符:
# 全局设置(提交时转换为 LF,检出时不转换)
git config --global core.autocrlf input# 对已有文件重新规范化换行符
git rm --cached -r .
git reset --hard
注意事项
-
备份重要文件:
转换前建议备份整个目录,以防意外损坏二进制文件。cp -r your_folder your_folder_backup
-
排除二进制文件:
使用 [find] 时可通过-name
排除非文本文件:find . -type f ! -name "*.png" ! -name "*.exe" -exec dos2unix {} \;
-
验证转换结果:
检查文件是否仍包含\r
:# 列出所有含 CRLF 的文件 grep -rl $'\r' .
总结
方法 | 命令 | 适用场景 |
---|---|---|
dos2unix | find . -type f -exec dos2unix {} \; | 推荐,安全高效 |
sed | find . -type f -exec sed -i 's/\r$//' {} \; | 无需安装额外工具 |
tr | find . -type f -exec sh -c 'tr -d "\r" < "{}" > "{}.tmp" && mv "{}.tmp" "{}"' \; | 低效,临时文件 |
Git | git config --global core.autocrlf input | 仅适用于 Git 仓库 |
选择最适合你的方法即可!