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重命名:
样本输出
@伊尼安完成了,谢谢。@伊尼安完成了,谢谢。我刚刚在我的原始帖子中加入了一个编辑,我已经完成了一半:我知道回声了。这很有魅力。谢谢,你挽救了这一天!我刚刚在我的原始帖子中加入了一个编辑,我已经完成了一半:我意识到了回声。这很有魅力。谢谢,你挽救了这一天!