首页 > 解决方案 > 在 Ubuntu/Linux 中使用变量模式批量重命名文件名

问题描述

我正在努力用要删除的变量模式重命名一堆文件。

我有:

1B_ACTCGCTA-CCTAGAGT_L001_R1_001.fastq.gz
1B_ACTCGCTA-CCTAGAGT_L001_R2_001.fastq.gz

97C_TAAGGCGA-TTATGCGA_L001_R1_001.fastq.gz
97C_TAAGGCGA-TTATGCGA_L001_R2_001.fastq.gz

98A_S62_L001_R1_001.fastq.gz
98A_S62_L001_R2_001.fastq.gz

并希望拥有:

1B_R1_001.fastq.gz
1B_R2_001.fastq.gz

97C_R1_001.fastq.gz
97C_R2_001.fastq.gz

98A_R1_001.fastq.gz
98A_R2_001.fastq.gz

如您所见,需要删除的模式是可变的,简单的匹配不起作用。一个合乎逻辑的解决方法是排除第一个和第三个下划线或第一个下划线和字母“R”之间的所有内容。不幸的是,我无法提出可以做到这一点的代码。它可以是任何东西,只要它可以工作、重命名、bash for in 循环等......

感谢您的帮助,丹尼

编辑:我试图使用for循环,但无法提出完整的代码来保留文件名的第二部分(字母“R”后面的所有内容)

for file in *.fastq.gz; do echo mv "${file}" "${file/_*/\/}"; done

标签: bashubuntufor-looprenamefile-rename

解决方案


以下应该有效:

for f in *.fastq.gz; do echo mv "$f" "${f%%_*}_${f#*_*_*_}"; done

echo之前特别添加了mv,所以它会打印它会移动的内容。如果打印正确,请删除echo并再次运行。

这里发生的是我通过 %% 获取 head 并通过 # 获取 tail 并将它们连接起来。请参阅%% 和 #Parameter Expansionman bash含义。该解决方案依赖于文件名中的 _ 数量是恒定的。


推荐阅读