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文件上循环
  • 创建一个变量,从名称中去掉不必要的内容
  • 将文件名移动到该新名称
我希望有更好的方法来做到这一点,但这是我头脑中想出来的

测试:

注意我在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

您可以尝试使用循环提取文件名的重要部分:

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等。让我看看是否可以调整它:)