使用可变扩展名重命名多个文件以删除文件名的开头和结尾

使用可变扩展名重命名多个文件以删除文件名的开头和结尾

我有多个文件需要重命名,如下所示:

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一旦您确认它正在做正确的事情,就将其删除。

相关内容