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