You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中重命名多文件:调整名称结构并添加前置序号

Bash批量重命名文件:添加有序编号并调整字段顺序

没问题,我来帮你搞定这个批量重命名的需求!先理清楚核心目标:把原文件名里的样本名、任务ID、染色体编号三个字段调整顺序,同时给每个文件加上连续的有序编号(用三位数字格式化,避免排序混乱)。

先明确原文件名结构

从你的示例来看,原文件名的固定格式是:
[样本名(可含下划线,比如CSC0832_1)]_[任务ID(1-12的数字)]_[染色体编号(chrI至chrXXI)].vcf

举两个对应例子:

  • 8116_1_chrI.vcf → 样本名8116、任务ID1、染色体chrI
  • CSC0832_1_7_chrVIII.vcf → 样本名CSC0832_1、任务ID7、染色体chrVIII

实现步骤

我们可以用Bash循环配合正则表达式拆分字段,再重新组合成新文件名,全程在终端就能完成。

1. 先预览重命名效果(安全测试)

先执行下面的命令,不会实际修改文件,只会打印出将要执行的重命名操作,确认结果符合预期后再执行实际重命名:

count=1
for file in *.vcf; do
    # 用正则拆分出样本名、任务ID、染色体编号
    read sample task chr <<< $(echo "$file" | sed -E 's/(.*)_([0-9]{1,2})_(chr.*)\.vcf/\1 \2 \3/')
    # 生成新文件名:有序编号_任务ID_样本名_染色体编号.vcf(编号用三位数字格式化)
    new_file=$(printf "%03d_%s_%s_%s.vcf" $count $task $sample $chr)
    echo "准备重命名:$file → $new_file"
    ((count++))
done

2. 执行实际重命名

如果预览结果没问题,把上面的echo "准备重命名:..."替换成mv "$file" "$new_file"即可:

count=1
for file in *.vcf; do
    read sample task chr <<< $(echo "$file" | sed -E 's/(.*)_([0-9]{1,2})_(chr.*)\.vcf/\1 \2 \3/')
    new_file=$(printf "%03d_%s_%s_%s.vcf" $count $task $sample $chr)
    mv "$file" "$new_file"
    ((count++))
done

自定义调整

如果你想修改字段的排列顺序,只需要调整printf里的参数顺序就行:
比如想要有序编号_样本名_任务ID_染色体编号.vcf的格式,就把printf改成:

new_file=$(printf "%03d_%s_%s_%s.vcf" $count $sample $task $chr)

关键细节说明

  • 用printf "%03d"生成三位数字编号:这样编号是001、002...010,而非1、2...10,避免后续排序时出现1、10、11...2的混乱。
  • 正则表达式(.*)_([0-9]{1,2})_(chr.*)\.vcf:专门匹配最后一个数字段(任务ID,1-12是1或2位数字),确保样本名里的下划线不会被误拆分。
  • 变量用双引号包裹:避免文件名中出现空格(虽然你的示例里没有,但这是Bash脚本的通用好习惯)。

内容的提问来源于stack exchange,提问作者Rachel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:57:44