我有多个文件需要重命名,如下所示:
5891_1_0_AD3884_ACTCTCGA_S10.bam
5891_1_0_AD3884_ACTCTCGA_S10.bam.bai
5891_1_AD3875_GAGCTTGT_S1.bam
5891_1_AD3875_GAGCTTGT_S1.bam.bai
5891_2_AD3876_ACACGGTT_S2_R1.bam
5891_2_AD3876_ACACGGTT_S2_R2.bam.bai
我想删除除 AD**** 之外的所有内容,以便最终的文件名为:
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai
AD**** 前后下划线(“_”)的数量并不总是一致的。目前 AD 后面始终是 4 位数字,但将来可能会增加到 5 位。
理想情况下,参数扩展的 bash 解决方案会很棒(在 Linux Ubuntu 环境中工作),尽管我尝试过但没有成功。sed、awk、grep 或最后重命名解决方案也是可行的,尽管我尝试过许多版本都没有成功。任何帮助都将不胜感激。
更新
@steeldriver 的重命名解决方案非常有效。
我能够通过以下修改使@Boba Fit 的解决方案发挥作用:
for file in *
do
fn=AD"${file#*AD}"
ext=${file#*.}
mv $file rename/${fn%%_*}.${ext}
done
新编辑
另一个问题是 AD 也可能是小写的 (ad)。例如:
5891_1_0_ad3884_ACTCTCGA_S10.bam
5891_1_0_ad3884_ACTCTCGA_S10.bam.bai
5891_1_AD3875_GAGCTTGT_S1.bam
5891_1_AD3875_GAGCTTGT_S1.bam.bai
5891_2_AD3876_ACACGGTT_S2_R1.bam
5891_2_AD3876_ACACGGTT_S2_R2.bam.bai
对于最终结果,如果它们全部大写就可以了(AD):
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai
但我需要能够识别输入中的大小写(不区分大小写)。
答案1
我为你写了一个 bash 脚本
#!/bin/bash
for file in *
do
name=$(echo "$file" | tr '[:lower:]' '[:upper:]')
name=AD${name#*_AD}
name=${name::6}
extension=${file#*.}
mv ${file} ${name}.${extension}
done
我#
删除了匹配的字符串前面的所有(最小可能的)部分*_AD
。在下一行中,我将 Sting 的最大长度缩短为 6。我通过删除匹配的 smales 部分来编写扩展名*.
。
然后我们将文件移动到${name}.${extension}
。
希望它能发挥作用。
答案2
基于 perl 的rename
:
$ rename -n 's/.*(AD\d+).*?[.](.*)/$1.$2/' *.ba[im]
rename(5891_1_0_AD3884_ACTCTCGA_S10.bam, AD3884.bam)
rename(5891_1_0_AD3884_ACTCTCGA_S10.bam.bai, AD3884.bam.bai)
rename(5891_1_AD3875_GAGCTTGT_S1.bam, AD3875.bam)
rename(5891_1_AD3875_GAGCTTGT_S1.bam.bai, AD3875.bam.bai)
rename(5891_2_AD3876_ACACGGTT_S2_R1.bam, AD3876.bam)
rename(5891_2_AD3876_ACACGGTT_S2_R2.bam.bai, AD3876.bam.bai)
-n
一旦您确认它正在做正确的事情,就将其删除。