我想以递归方式重命名我的文件,以 *.fna.gz 结尾,父目录向上两级,即“Aspergillus_neoniger”。您可以在此图中查看子目录详细信息
.
├── Aaosphaeria_arxii
│ ├── all_assembly_versions
│ │ └── GCA_010015735.1_Aaoar1
│ │ ├── GCA_010015735.1_Aaoar1_assembly_structure
│ │ ├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ │ ├── GCA_010015735.1_Aaoar1_genomic.fna.gz
│ │ └── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
│ ├── latest_assembly_versions
│ │ └── GCA_010015735.1_Aaoar1
│ │ ├── GCA_010015735.1_Aaoar1_assembly_structure
│ │ ├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ │ ├── GCA_010015735.1_Aaoar1_genomic.fna.gz
│ │ └── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
│ └── representative
│ └── GCA_010015735.1_Aaoar1
│ ├── GCA_010015735.1_Aaoar1_assembly_structure
│ ├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ ├── GCA_010015735.1_Aaoar1_genomic.fna.gz
│ └── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
我没有发布“tree”的输出,因为发布后无法以正确的格式看到它。每个科学名称“Aaosphaeria_arxii”都有三个子目录,我只想从“latest_assembly_versions”文件夹中提取带有“_genomic.fna.gz”扩展名的文件。在本例中,将*“_genomic.fna.gz”重命名为科学名称“Aaosphaeria_arxii”。
问候
答案1
您可以使用以下rename
命令:
rename 's|((.+?)/.*/)(.*)|$1$2_$3|' */*/*/*fna.gz
前:
$ tree
.
└── Aaosphaeria_arxii
├── all_assembly_versions
│ └── GCA_010015735.1_Aaoar1
│ ├── GCA_010015735.1_Aaoar1_assembly_structure
│ ├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ ├── GCA_010015735.1_Aaoar1_genomic.fna.gz
│ └── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
├── latest_assembly_versions
│ └── GCA_010015735.1_Aaoar1
│ ├── GCA_010015735.1_Aaoar1_assembly_structure
│ ├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ ├── GCA_010015735.1_Aaoar1_genomic.fna.gz
│ └── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
└── representative
└── GCA_010015735.1_Aaoar1
├── GCA_010015735.1_Aaoar1_assembly_structure
├── GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
├── GCA_010015735.1_Aaoar1_genomic.fna.gz
└── GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
7 directories, 12 files
后:
$ tree
.
└── Aaosphaeria_arxii
├── all_assembly_versions
│ └── GCA_010015735.1_Aaoar1
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_genomic.fna.gz
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
│ └── GCA_010015735.1_Aaoar1_assembly_structure
├── latest_assembly_versions
│ └── GCA_010015735.1_Aaoar1
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_genomic.fna.gz
│ ├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
│ └── GCA_010015735.1_Aaoar1_assembly_structure
└── representative
└── GCA_010015735.1_Aaoar1
├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_genomic.fna.gz
├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz
└── GCA_010015735.1_Aaoar1_assembly_structure
7 directories, 12 files
解释
该rename
工具使用 perl 替换运算符: 。这将通过替换来rename 's/old/new/
重命名文件。可以是一个简单的字符串,也可以是一个正则表达式,就像这里一样。old
new
old
正则表达式可以简化为:.+?/.*/.*
匹配“直到第一个/
(的所有内容.+?/)
,然后是直到最后一个/
( .*/
) 的所有内容,然后是直到末尾 ( .*
) 的所有内容”。括号就是所谓的“捕获组”。它们允许我们“捕获”匹配的字符串,然后将其作为$1
, $2
, ...$N
提供给尽可能多的括号。
因此,这里我们实际上有((.+?)/.*/)(.*)
。第一个外括号 ( ((.+?)/.*/)
) 获取直到文件名的所有内容,因此它们将获取文件的路径,直到父目录。这变为$1
。第二个内括号 ( (.+?)
) 捕获父目录,它变为$2
。最后一个括号 ( (.*)
) 捕获文件的名称。
使用以上所有方法,我们将文件重命名为$1$2_$3
。这是$1
“文件的路径”(例如Aaosphaeria_arxii/all_assembly_versions/GCA_010015735.1_Aaoar1/
),然后$2
是父目录的名称,后跟,_
最后是$3
原始文件名。
您仍未向我们展示您期望的输出。如果您还想将文件移出其目录,您可以改为执行以下操作:
rename 's|((.+?)/.*/)(.*)|$2_$3|' */*/*/*fna.gz
这将产生以下内容:
$ tree
.
├── Aaosphaeria_arxii
│ ├── all_assembly_versions
│ │ └── GCA_010015735.1_Aaoar1
│ │ └── GCA_010015735.1_Aaoar1_assembly_structure
│ ├── latest_assembly_versions
│ │ └── GCA_010015735.1_Aaoar1
│ │ └── GCA_010015735.1_Aaoar1_assembly_structure
│ └── representative
│ └── GCA_010015735.1_Aaoar1
│ └── GCA_010015735.1_Aaoar1_assembly_structure
├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_cds_from_genomic.fna.gz
├── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_genomic.fna.gz
└── Aaosphaeria_arxii_GCA_010015735.1_Aaoar1_rna_from_genomic.fna.gz