bash - 在 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
解决方案
以下应该有效:
for f in *.fastq.gz; do echo mv "$f" "${f%%_*}_${f#*_*_*_}"; done
我echo
之前特别添加了mv
,所以它会打印它会移动的内容。如果打印正确,请删除echo
并再次运行。
这里发生的是我通过 %% 获取 head 并通过 # 获取 tail 并将它们连接起来。请参阅%% 和 #Parameter Expansion
的man bash
含义。该解决方案依赖于文件名中的 _ 数量是恒定的。