Переименовать имена файлов с именем родительского каталога

Я хочу переименовать мои файлы рекурсивно, заканчивающиеся *.fna.gz с родительским каталогом two-step-up, т.е. "Aspergillus_neoniger". Вы можете увидеть детали подкаталогов на этом изображении

изображение команды 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 

Я не стал публиковать вывод команды "tree", потому что после публикации он не отображался в нужном формате. Каждое научное имя "Aaosphaeria_arxii" имеет три подкаталога, я просто хочу извлечь файлы из папки "latest_assembly_versions" с расширением "_genomic.fna.gz". И переименовать *"_genomic.fna.gz" с научным названием "Aaosphaeria_arxii" в этом случае.

Regards

2
задан 25 May 2021 в 14:27

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
5
ответ дан 28 July 2021 в 11:35

Другие вопросы по тегам:

Похожие вопросы: