我正在努力用要删除的变量模式重命名一堆文件。
我有:
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
%% 和 # 的含义。该解决方案依赖于文件名中的 _ 数量是恒定的。
关于bash - 在 Ubuntu/Linux 中使用变量模式批量重命名文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625909/