如何修复通过变量重命名以短横线开头文件的mv命令错误
修复bash重命名脚本中的mv命令错误
问题出在你给$i添加的多余引号转义上:"\"""$i""\""这种写法会让bash把字面的双引号作为文件名的一部分传递给mv,比如实际传递的参数是"-0"(包含引号),但你的文件实际名为-0,所以mv找不到对应的文件。
修正后的脚本
直接用"$i"即可,bash的双引号已经能正确处理以连字符开头的文件名,配合--标记选项结束,完全不需要额外转义引号:
for i in -*; do N=3 target=$(echo "$i" | sed -r "s/-//; :r;s/\b[0-9]{1,$((N - 1))}\b/0&/g;tr; s/$/.json/") echo mv -v -- "$i" "$target" mv -v -- "$i" "$target" done
额外优化
可以把多个sed命令合并为一个,减少管道调用,提升效率:
- 合并
s/-//、补零逻辑和添加.json后缀的操作到单个sed命令中,避免多次启动sed进程。
为什么手动执行没问题?
手动输入mv -v -- "-0" 000.json时,bash会解析双引号,把-0作为纯文件名参数传递给mv;但脚本里的"\"""$i""\""写法,是把双引号作为参数的字面内容传递,相当于让mv去找名为"-0"(带引号)的文件,自然找不到。
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

