bash - 替换文件名中模式的最短匹配
问题描述
我有具有以下文件名模式的文件:
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
欢迎任何建议。
解决方案
您的原始文件名有几个下划线字符,但您只想从倒数第二个下划线中删除。在这种情况下,请尝试:
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
。
推荐阅读
- solr - Zookeeper znode 不显示数据目录中的文件
- perl - open(STDERR, ">&STDOUT" ) 的含义
- amazon-web-services - SonarQube、Fargate 和 AWS ElasticSearch
- module - 我应该为我的 Guile 项目中的每个文件定义单独的模块吗?
- java - 如何使用 JPA 在运行时为实体使用不同的表?
- swift - RxSwift:如何通过视图调整大小来自动调整子层大小
- javascript - 如何根据 Firebase 中的值自动检查复选框?
- google-sheets - 如果工作表 2 上的“User_ID”与工作表 1 上的“User_ID”匹配,则从工作表 1 复制“名称”
- python - 如果从 PySimpleGUI 弹出单击 sg.Submit(),如何生成 file.txt?
- bigdata - Julia 中的大数组