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

时间:2018-05-31 13:49:12

标签: 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-loop但是无法提供完整的代码来保留文件名的第二部分(字母后面的所有内容" R")

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

3 个答案:

答案 0 :(得分:2)

以下内容应该有效:

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

我在echo之前专门添加了mv,因此会打印它会移动的内容。如果打印正确,请删除echo并再次运行。

这里发生的事情是我通过#%和尾部经过#并将它们连接起来。有关%%和#的含义,请参阅Parameter Expansion中的man bash。解决方案依赖于文件名中_的数量是常量。

答案 1 :(得分:2)

使用(Perl)rename

rename --dry-run 's/_.*_R/_R/' *gz

示例输出

'1B_ACTCGCTA-CCTAGAGT_L001_R1_001.fastq.gz' would be renamed to '1B_R1_001.fastq.gz'
'1B_ACTCGCTA-CCTAGAGT_L001_R2_001.fastq.gz' would be renamed to '1B_R2_001.fastq.gz'
'97C_TAAGGCGA-TTATGCGA_L001_R1_001.fastq.gz' would be renamed to '97C_R1_001.fastq.gz'
'97C_TAAGGCGA-TTATGCGA_L001_R2_001.fastq.gz' would be renamed to '97C_R2_001.fastq.gz'
'98A_S62_L001_R1_001.fastq.gz' would be renamed to '98A_R1_001.fastq.gz'
'98A_S62_L001_R2_001.fastq.gz' would be renamed to '98A_R2_001.fastq.gz'

答案 2 :(得分:1)

不依赖于下划线数量的答案:

    const renderPagination = numbers.map(number => {
        var activeClass = this.state.currentPage === number ? 'active' : '';
        return (
            <li className={`controls ${activeClass}`} key={number} id={number} onClick={this.handlePages}>
                {number}
            </li>
        );
    });