使用父目录名称重命名文件名

sha*_*zad 2 find rename cp mv

我想递归地重命名我的文件,以 *.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 
Run Code Online (Sandbox Code Playgroud)

我没有发布“树”的输出,因为发布后没有以正确的格式看到它。每个学名“Aaosphaeria_arxii”都有三个子目录,我只想从“latest_assembly_versions”文件夹中提取带有“_genomic.fna.gz”扩展名的文件。在这种情况下,将 *"_genomic.fna.gz" 重命名为科学名称 "Aaosphaeria_arxii"。

问候

ter*_*don 5

您可以使用以下rename命令:

rename 's|((.+?)/.*/)(.*)|$1$2_$3|' */*/*/*fna.gz
Run Code Online (Sandbox Code Playgroud)

前:

$ 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
Run Code Online (Sandbox Code Playgroud)

后:

$ 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
Run Code Online (Sandbox Code Playgroud)

解释

rename工具使用 perl 替换运算符:rename 's/old/new/. 这将通过替换oldnew. 该old可以是一个简单的字符串,也可以是一个正则表达式就像它是在这里。

正则表达式可以简化为:.+?/.*/.*它匹配“直到第一个/( .+?/),然后直到最后一个/( .*/) 的所有内容,然后直到最后( ) 的所有内容.*。括号是所谓的“捕获组”。它们允许我们“捕获”匹配的字符串,然后将其作为$1, $2, ...$N用于尽可能多的括号。

所以,在这里,我们实际上有((.+?)/.*/)(.*). 第一个外括号 ( ((.+?)/.*/)) 获取文件名之前的所有内容,因此它们将获取文件的路径,直到父目录。这成为$1。第二个内括号 ( (.+?)) 捕获父目录,该目录变为$2. 最后一个括号 ( (.*)) 表示文件名。

使用以上所有内容,我们将文件重命名为$1$2_$3. 这是$1,文件的路径”(例如Aaosphaeria_arxii/all_assembly_versions/GCA_010015735.1_Aaoar1/),然后$2是父目录的名称,后跟 a _,最后$3是原始文件名。


您仍然没有向我们展示您期望的输出。如果您还想将文件移出其目录,则可以改为执行以下操作:

rename 's|((.+?)/.*/)(.*)|$2_$3|' */*/*/*fna.gz
Run Code Online (Sandbox Code Playgroud)

这将产生以下内容:

$ 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
Run Code Online (Sandbox Code Playgroud)