我有多个文件需要重命名如下:
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.baiAD之前和之后的下划线("_")的数量并不总是一致的。目前,AD之后总是有4位数,但将来可能会增加到5位。
理想情况下,参数扩展的bash解决方案将是很棒的(在Linux环境中工作),尽管我尝试过这一点,但没有成功。sed、awk、grep或最后重命名解决方案也是可能的,尽管我尝试过许多版本的解决方案,但都没有成功。任何帮助都将不胜感激。
@steeldriver的重命名解决方案工作得很好。
我能够通过以下修改使@Boba的解决方案工作:
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但我需要能够识别大写和小写(大小写不敏感)的输入。
发布于 2020-06-11 13:24:22
我已经为你写了一个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。我使用remogin编写扩展,该扩展部分与*.匹配。
然后我们将文件移动到${name}.${extension}。
希望一切顺利。
发布于 2020-06-11 13:28:41
使用基于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正在做正确的事情,就删除它。
https://askubuntu.com/questions/1249233
复制相似问题