bash - 在 Ubuntu/Linux 中使用变量模式批量重命名文件名

标签 bash ubuntu for-loop rename file-rename

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

我有:

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 Expansionman bash %% 和 # 的含义。该解决方案依赖于文件名中的 _ 数量是恒定的。

关于bash - 在 Ubuntu/Linux 中使用变量模式批量重命名文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625909/

相关文章:

c - 为什么将 uint8_t 与整数相乘会得到 0?

c++ - 如何从理论上计算嵌套循环的运行时间?

loops - 如何在 set 命令中使用括号转义变量?

linux - 在 linux 中使用批处理文件启动多个 firefox 配置文件

arrays - 如何连接两个字符串以创建变量名称

linux - 在 Bash 中添加/平均多个变量

c - 需要在C代码中运行 'read'命令

node.js - 为什么我无法访问 docker 容器中的 node.js 应用程序?

linux - 命令 : tail file. txt '

git - 从另一个用户创建的另一个分支创建一个新分支