首页 > 解决方案 > 替换文件名中模式的最短匹配

问题描述

我有具有以下文件名模式的文件:

C14_1_S1_R1_001_copy1.fastq.gz

我想以这种方式重命名:

C14_1_S1_R1.fastq.gz

我没有成功地测试过以下模式替换策略:

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

欢迎任何建议。

标签: bash

解决方案


您的原始文件名有几个下划线字符,但您只想从倒数第二个下划线中删除。在这种情况下,请尝试:

 mv "$f" "${f%_*_*}.fastq.gz"

考虑一个包含这些文件的目录:

$ ls -1
C14_1_S1_R1_001_copy1.fastq.gz
C15_1_S1_R1_001_copy1.fastq.gz

如果我们运行我们的循环然后运行一个新的ls,我们会看到更改的文件名:

$ for f in ./*.fastq.gz; do mv "$f" "${f%_*_*}.fastq.gz"; done
$ ls -1
C14_1_S1_R1.fastq.gz
C15_1_S1_R1.fastq.gz

这里的关键${var%word}后缀删除,它匹配与 glob匹配的最短word后缀。因此,${f%_*_*}删除倒数第二个下划线字符及其之后的所有内容。 ${f%_*_*}.fastq.gz删除倒数第二个下划线字符和之后的所有内容,然后恢复您想要的 . 后缀.fastq.gz


推荐阅读