Linux 批量重命名长文件名
我有如下文件名:Linux 批量重命名长文件名,linux,rename,filenames,Linux,Rename,Filenames,我有如下文件名: 5_END_1033_ACAGTG_L002_R1_001.fastq.gz 5_END_1033_ACAGTG_L002_R2_001.fastq.gz 40_END_251_GTGAAA_L002_R1_001.fastq.gz 40_END_251_GTGAAA_L002_R2_001.fastq.gz 我想要像这样的东西: END_1033_R1.fastq.gz END_1033_R2.fastq.gz END_251_R1.fastq.gz END_251_R2.
5_END_1033_ACAGTG_L002_R1_001.fastq.gz
5_END_1033_ACAGTG_L002_R2_001.fastq.gz
40_END_251_GTGAAA_L002_R1_001.fastq.gz
40_END_251_GTGAAA_L002_R2_001.fastq.gz
我想要像这样的东西:
END_1033_R1.fastq.gz
END_1033_R2.fastq.gz
END_251_R1.fastq.gz
END_251_R2.fastq.gz
在linux中有好的方法重命名这些文件吗?您可以尝试使用循环提取文件名的重要部分:
for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done
这将为您提供一个新的文件名列表。然后可以移动它们:
for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done
要稍微分解一下这一点:
- 在*.gz文件上循环
- 创建一个变量,从名称中去掉不必要的内容
- 将文件名移动到该新名称
awk
可能会更好:
for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); echo $newname; done
这将按拆分文件名,并允许您使用$X
引用所需的列:
for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); mv $file "${newname}.fastq.gz"; done
您可以尝试使用循环提取文件名的重要部分:
for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done
这将为您提供一个新的文件名列表。然后可以移动它们:
for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done
要稍微分解一下这一点:
- 在*.gz文件上循环
- 创建一个变量,从名称中去掉不必要的内容
- 将文件名移动到该新名称
我希望有更好的方法来做到这一点,但这是我头脑中想出来的
测试:
注意我在bash 4.4.5中这样做
编辑
鉴于我不能完全确定名称中的哪些列是最重要的,awk
可能会更好:
for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); echo $newname; done
这将按拆分文件名,并允许您使用$X
引用所需的列:
for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); mv $file "${newname}.fastq.gz"; done
我刚刚意识到它并不是在所有情况下都能工作,比如:17_END_107A_CGATGT_L005_R1_001.fastq.gz和29_END_4271A_ACAGTG_L008_R1_001.fastq.gz。此外,我更喜欢先去掉数字和“例如40、5等等。让我看看我是否可以调整它:)我刚刚意识到它在所有情况下都不起作用,比如:17_END_107A_CGATGT_L005_R1_001.fastq.gz和29_END_4271A_ACAGTG_L008_001.fastq.gz。此外,我更愿意先取出数字和“”,即40、5等。让我看看是否可以调整它:)