Bash循环批量重命名文件:替换heat_1为heat_21且保留扩展名
解决Bash文件名替换时意外丢失扩展名的问题
问题场景
需要将以下四个文件名中的heat_1替换为heat_21:
- 5JUP_N2_UUCGCU_heat_1.out
- 5JUP_N2_UUCGCU_heat_1.rst
- mdcrd_heat_1
- mdinfo_heat_1
原脚本执行后.out和.rst扩展名被意外移除,原因有两个:
${i/heat_*/heat_21}中的heat_*是贪婪匹配,会把heat_1及其后面的所有字符(包括扩展名)全部替换成heat_21- 循环写法
for i in ls *存在语法错误,会把字符串"ls"和"*"当作循环对象,而非遍历当前目录下的所有文件
正确脚本写法
for i in *; do mv "$i" "${i/heat_1/heat_21}" done
说明
- 用
heat_1精确匹配目标子串,只会替换文件名中第一次出现的heat_1为heat_21,不会影响后续的扩展名或其他字符 - 如果需要全局替换文件名中所有的
heat_1(单文件名中一般不会重复),可以将替换语法改为${i//heat_1/heat_21}(双斜杠表示全局替换) - 循环写法
for i in *会正确遍历当前目录下的所有文件,解决原脚本的语法问题
内容的提问来源于stack exchange,提问作者Pete Hwang
相关产品推荐
相关产品推荐

