bash:修剪除文件名中匹配glob(和扩展名)的前缀之外的所有内容

时间:2016-02-17 17:54:37

标签: bash

我正在尝试使用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

1 个答案:

答案 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"}获取原始文件名,并从末尾删除该后缀,只留下我们要保留的开头的前缀。 (引用它可确保将字符串视为文字内容,而不是全局样式模式)。