Bash批量重命名csv文件:将文件名序号x改为x+10的实现方法
批量重命名A_B_x.csv为A_B_{x+10}.csv的Bash实现方案
问题说明
需要将命名规则为A_B_x.csv(x取值1-10)的csv文件,统一修改为A_B_{x+10}.csv,例如A_B_1.csv改为A_B_11.csv。原有代码仅硬编码替换了1.csv为11.csv,没有提取文件名中的序号x做算术运算,因此无法适配所有序号的文件。
推荐实现代码(纯Bash内置能力,无外部依赖)
for f in A_B_*.csv; do # 提取文件名中的序号x:先去掉前缀"A_B_",再去掉后缀".csv" x=${f#A_B_} x=${x%.csv} # 计算新序号 new_x=$((x + 10)) # 拼接生成新文件名 new_name="A_B_${new_x}.csv" # 执行重命名,-v参数可打印修改日志 mv -v -- "$f" "$new_name" done
代码说明
- 用Bash内置的参数展开提取序号,不需要额外调用sed等外部工具,执行效率更高、逻辑更易读
- 双引号包裹变量是通用最佳实践,可兼容带空格、特殊字符的文件名场景
- 命令中的
--用于处理少数以-开头的异常文件名,避免mv将文件名识别为参数
预校验方法
正式执行重命名前,可先将mv改为echo mv预览修改效果,确认符合预期后再去掉echo实际运行:
for f in A_B_*.csv; do x=${f#A_B_} x=${x%.csv} new_x=$((x + 10)) new_name="A_B_${new_x}.csv" echo mv "$f" "$new_name" done
其他可选实现
如果你的系统预装了perl版本的rename工具(大部分Linux发行版、MacOS通过brew安装后都支持),可以用更短的代码实现:
rename 's/A_B_(\d+)\.csv/"A_B_".($1+10).".csv"/e' A_B_*.csv
内容的提问来源于stack exchange,提问作者iiiiiiiiiiiiiiiiiiii
相关产品推荐
相关产品推荐

