如何用bash/shell命令修改文件名数字序列,将1~1000改为1001~2000
批量修改序列文件名解决方案
原代码错误原因
你编写的双层for循环逻辑存在严重问题:外层每遍历1个11000的i值,内层都会完整遍历10012000的所有j值,单个源文件会被执行1000次mv操作,所有源文件最终都会被反复覆盖,最后仅会剩下s_nn_2000.txt这一个文件,完全不符合需求。
可行解决方法
方案1:Bash原生单循环(兼容性最高,无需额外工具)
直接在单循环内做算术运算,每个原序号i对应的新序号为i+1000,对应命令如下:
for i in {1..1000} do mv s_nn_"$i".txt s_nn_$((i + 1000)).txt done
也可以简写为单行版本:
for i in {1..1000}; do mv s_nn_${i}.txt s_nn_$((i+1000)).txt; done
方案2:rename工具快速实现(适合预装Perl版rename的发行版,如Debian、Ubuntu)
用正则匹配原文件名中的序号,直接做加法替换:
rename 's/s_nn_(\d+)\.txt/sprintf("s_nn_%d.txt", $1 + 1000)/e' s_nn_*.txt
注意事项
- 执行实际重命名操作前,建议先将命令中的
mv替换为echo mv,预览输出的重命名对应关系是否正确,确认无误后再去掉echo执行实际操作,避免文件误覆盖。 - 如果当前目录下存在其他不符合
s_nn_*.txt命名规则的文件,执行命令前建议先过滤文件范围,避免误操作。
内容的提问来源于stack exchange,提问作者triangular_triffle
相关产品推荐
相关产品推荐

