首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用变量扩展名重命名多个文件,以删除文件名的开头和结尾

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

Ask Ubuntu用户
提问于 2020-06-11 13:08:18
回答 2查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
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*外,我希望删除所有内容,以便生成的文件名为:

代码语言:javascript
复制
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai

AD之前和之后的下划线("_")的数量并不总是一致的。目前,AD之后总是有4位数,但将来可能会增加到5位。

理想情况下,参数扩展的bash解决方案将是很棒的(在Linux环境中工作),尽管我尝试过这一点,但没有成功。sed、awk、grep或最后重命名解决方案也是可能的,尽管我尝试过许多版本的解决方案,但都没有成功。任何帮助都将不胜感激。

更新

@steeldriver的重命名解决方案工作得很好。

我能够通过以下修改使@Boba的解决方案工作:

代码语言:javascript
复制
for file in *
do
 fn=AD"${file#*AD}"
 ext=${file#*.}
 mv $file rename/${fn%%_*}.${ext}
done

新编辑

另一个问题是,AD也可能是小写(ad)。例如:

代码语言:javascript
复制
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),则可以:

代码语言:javascript
复制
AD3884.bam
AD3884.bam.bai
AD3875.bam
AD3875.bam.bai
AD3876.bam
AD3876.bam.bai

但我需要能够识别大写和小写(大小写不敏感)的输入。

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2020-06-11 13:24:22

我已经为你写了一个bash脚本

代码语言:javascript
复制
#!/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}

希望一切顺利。

票数 1
EN

Ask Ubuntu用户

发布于 2020-06-11 13:28:41

使用基于perl的rename

代码语言:javascript
复制
$ 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正在做正确的事情,就删除它。

票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1249233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档