Bash脚本批量重命名文件时路径拼接异常问题求助
Bash脚本重命名文件时路径拼接异常的解决办法
这个问题我之前也碰到过!大概率是你的rename.csv文件带有Windows格式的换行符(行尾是\r\n而非Unix系统的\n),导致读取变量时混入了回车符,进而干扰了输出和路径拼接。
问题原因分析
当read命令读取Windows格式的CSV时,会把行尾的\r(回车符)一并读入col2变量中。而\r的作用是让终端光标回到当前行的开头,所以当你输出newname时:
- 先输出
$FOLDER$col2,也就是/Users/annaleigh/Documents/data/geo_ibm/PM_3\r \r让光标跳回行首,接下来输出的$col1.SJ.out.tab就会覆盖掉前面的路径前缀,最终显示成你看到的16_9_5_18.SJ.out.tabuments/data/geo_ibm/PM_3
解决办法
方法1:转换CSV文件为Unix格式
直接把CSV文件的换行符改成Unix标准:
- 如果你有
dos2unix工具,执行:dos2unix /Users/annaleigh/Documents/GitHub/muscle/rename.csv - 如果没有
dos2unix,用sed处理(Mac系统注意-i ''参数,Linux系统去掉''):sed -i '' 's/\r$//' /Users/annaleigh/Documents/GitHub/muscle/rename.csv
方法2:在脚本中清理变量里的回车符
如果不想修改原文件,可以在读取变量后,直接移除col2中的回车符,修改后的脚本如下:
#!/bin/bash FOLDER=/Users/annaleigh/Documents/data/geo_ibm/ while IFS=, read -r col1 col2 do # 移除col2中的回车符,避免干扰路径拼接 col2=${col2//$'\r'/} oldfile="$FOLDER$col1.SJ.out.tab" newname="$FOLDER$col2$col1.SJ.out.tab" echo "$oldfile" echo "$newname" # 确认输出正确后,取消注释下面的行来执行实际重命名 # mv "$oldfile" "$newname" done < /Users/annaleigh/Documents/GitHub/muscle/rename.csv
另外建议给echo的变量加上双引号,避免遇到含空格的文件名时出现意外问题。
内容的提问来源于stack exchange,提问作者Al Bro
相关产品推荐
相关产品推荐

