我正在尝试使用bash
作为特定扩展名.bam
的所有文件重命名。
文件
IonXpress_001_R_2016_02_11_11_51_07_user_Proton-34-160210_Lurie_MedExome_Hi-Q_Auto_user_Proton-34-160210_Lurie_MedExome_Hi-Q_84.bam
IonXpress_002_R_2016_02_11_11_51_07_user_Proton-34-160210_Lurie_MedExome_Hi-Q_Auto_user_Proton-34-160210_Lurie_MedExome_Hi-Q_84.bam
IonXpress_003_R_2016_02_11_11_51_07_user_Proton-34-160210_Lurie_MedExome_Hi-Q_Auto_user_Proton-34-160210_Lurie_MedExome_Hi-Q_84.bam
TSVC_variants_IonXpress_001.vcf
TSVC_variants_IonXpress_002.vcf
TSVC_variants_IonXpress_003.vcf
重命名后的所需输出
IonXpress_001.bam
IonXpress_002.bam
IonXpress_003.bam
TSVC_variants_IonXpress_001.vcf
TSVC_variants_IonXpress_002.vcf
TSVC_variants_IonXpress_003.vcf
bash循环
for file in *.bam
do
mv "$file" "${file/*_*.bam/*_.bam}"
done
答案 0 :(得分:2)
如果_R_
不变,很容易利用它:
for file in *.bam; do
mv -- "$file" "${file%%_R_*}.bam"
done
否则,一个人最终会得到这样的结果:
for file in *.bam; do
suffix=${file#*_*_} # calculate what's left after trimming the parts we want
prefix=${file%"_$suffix"} # strip that remainder off the tail of the original filename
mv -- "$file" "$prefix.bam" # ...and substitute what's left
done
为了解释这是如何工作的,parameter expansion文档将是一个非常宝贵的指南。但是,这个过程可以归纳为:
${file#*_*_}
从$file
的开头开始匹配删除内容非贪婪(尽可能少匹配),包括前两个下划线和前面的内容。因此,结果类似于suffix=_R_2016_02_11_11_51_07_user_Proton-etc-etc.bam
。prefix=${file%"_$suffix"}
获取原始文件名,并从末尾删除该后缀,只留下我们要保留的开头的前缀。 (引用它可确保将字符串视为文字内容,而不是全局样式模式)。