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

Bash 使用变量模式在Ubuntu/Linux中批量重命名文件名,bash,ubuntu,for-loop,rename,file-rename,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.f

我正在努力重命名一堆具有要删除的可变模式的文件

我有:

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-loop等等

谢谢你的帮助, 丹尼

编辑:我曾试图使用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
我特别在mv之前添加了echo,所以它会打印出它会移动的内容。如果打印正确,请删除echo并再次运行


这里发生的事情是我通过%%取头部和尾部,并将它们连接起来。有关%%和的含义,请参见man bash中的参数展开。该解决方案依赖于文件名中的uu数保持不变。

以下各项应起作用:

for f in *.fastq.gz; do echo mv "$f" "${f%%_*}_${f#*_*_*_}"; done
我特别在mv之前添加了echo,所以它会打印出它会移动的内容。如果打印正确,请删除echo并再次运行


这里发生的事情是我通过%%取头部和尾部,并将它们连接起来。有关%%和的含义,请参见man bash中的参数展开。解决方案依赖于文件名中的uu数保持不变。

答案不依赖于下划线数:

for file in $(ls); do
    mv $file $(echo $file | awk -F _ 'BEGIN {OFS="_"} {print $1, $(NF-1), $NF}');
done

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

for file in $(ls); do
    mv $file $(echo $file | awk -F _ 'BEGIN {OFS="_"} {print $1, $(NF-1), $NF}');
done
使用Perl重命名:

样本输出

使用Perl重命名:

样本输出


@伊尼安完成了,谢谢。@伊尼安完成了,谢谢。我刚刚在我的原始帖子中加入了一个编辑,我已经完成了一半:我知道回声了。这很有魅力。谢谢,你挽救了这一天!我刚刚在我的原始帖子中加入了一个编辑,我已经完成了一半:我意识到了回声。这很有魅力。谢谢,你挽救了这一天!