Shell创建目录时最后一级目录名末尾多出\r字符的问题如何解决
问题成因
你遇到的是跨平台换行符不兼容问题:
- Windows系统的文本文件默认换行符为
CRLF(即\r\n,回车+换行两个字符) - Linux/macOS等类Unix系统的文本文件默认换行符为
LF(即\n,仅换行一个字符)
你编写的Shell脚本如果是在Windows环境下保存、或者通过Windows系统传输过,会自动把换行符替换为CRLF格式,当你在类Unix环境下执行这个脚本时,系统不会把行尾的\r当作换行符的一部分,而是会直接把它拼接到你写的路径参数末尾,最终就生成了带\r后缀的third目录。
解决办法
1. 修复Shell脚本的换行符格式
可以用以下任意一种方法把脚本的换行符转换为Unix兼容的LF格式:
- 用
dos2unix工具直接转换:执行命令dos2unix 你的脚本文件名.sh即可一键替换所有换行符 - 如果没有安装
dos2unix,可以用sed命令处理:sed -i 's/\r$//' 你的脚本文件名.sh,这个命令会直接删除脚本所有行尾的\r字符 - 如果你是用VS Code、Notepad++等编辑器写脚本,可以直接在编辑器右下角把换行符格式从
CRLF改成LF之后再保存脚本
2. 删除已生成的带\r后缀的异常目录
直接用普通的rmdir命令识别不到带特殊字符的目录名,可以用以下方法处理:
- 先进入
Home/first/second目录,执行命令rmdir third$'\r',这里$'\r'是Shell的ANSI-C转义写法,可以准确匹配回车字符 - 如果上述方法无效,可以用通配符匹配删除:
rmdir third?,注意要确认当前目录下没有其他以third开头加单个字符的目录再执行,避免误删
内容的提问来源于stack exchange,提问作者lime
相关产品推荐
相关产品推荐

