如何在Bash中重命名多文件:调整名称结构并添加前置序号
Bash批量重命名文件:添加有序编号并调整字段顺序
没问题,我来帮你搞定这个批量重命名的需求!先理清楚核心目标:把原文件名里的样本名、任务ID、染色体编号三个字段调整顺序,同时给每个文件加上连续的有序编号(用三位数字格式化,避免排序混乱)。
先明确原文件名结构
从你的示例来看,原文件名的固定格式是:[样本名(可含下划线,比如CSC0832_1)]_[任务ID(1-12的数字)]_[染色体编号(chrI至chrXXI)].vcf
举两个对应例子:
8116_1_chrI.vcf→ 样本名8116、任务ID1、染色体chrICSC0832_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
相关产品推荐
相关产品推荐

