使用Bash脚本批量修改文件夹名称出现异常结果求助
问题原因
文件夹名称末尾的$\r是Windows风格的回车符(CR)——你的exceltest.csv是在Windows环境下生成的,行尾采用CRLF(\r\n)格式,而Linux系统默认用LF(\n)作为行尾分隔符。Bash的read命令读取时会保留行尾的\r,导致newStr变量带上这个不可见控制字符,最终重命名后的文件夹名包含\r。GUI通常自动忽略这类控制字符所以显示正常,但CLI会将其转义为$\r。
解决方法
1. 先修复CSV文件的行尾格式
直接把CSV转换成Linux兼容的LF格式,用以下命令之一:
- 安装
dos2unix工具后转换:sudo apt install dos2unix dos2unix exceltest.csv - 用
sed命令直接替换行尾的\r:sed -i 's/\r$//' exceltest.csv
2. 在脚本中处理变量(无需修改CSV文件)
在read命令之后,立即去除newStr末尾的\r,同时修复原脚本的find参数错误:
dir='/home/company/customer' while IFS=, read -r oldStr newStr; do # 去除newStr末尾的回车符 newStr=${newStr%$'\r'} # 修复find参数:-maxdepth无空格,execdir用相对路径更准确 find "$dir" -type d -name "$oldStr" -maxdepth 1 -execdir mv -n "$oldStr" "$newStr" \; done < exceltest.csv
原脚本的额外错误说明
-max depth应为-maxdepth(参数名无空格)execdir执行时当前目录是目标文件夹的父目录,用相对路径$oldStr/$newStr比绝对路径更准确,避免路径冗余
后续影响说明
如果不修复,带\r的文件夹名会导致后续脚本操作(查找、遍历、重命名)出错——脚本匹配名称时无法识别带隐藏\r的文件夹。修复后即可完全避免这类问题。
内容的提问来源于stack exchange,提问作者Trevor McDaniel
相关产品推荐
相关产品推荐

