Vous pouvez utiliser le rename
commande :
rename 's|((.+?)/.*/)(.*)|$1$2_$3|' */*/*/*fna.gz
Avant :
$ 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
Après :
$ 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
Explication
Les rename
utilise l'opérateur de substitution perl : rename 's/old/new/
. Ceci renommera le fichier en remplaçant old
con new
. En old
peut être une simple chaîne de caractères, ou une expression régulière comme c'est le cas ici.
L'expression régulière peut être simplifiée comme suit : .+?/.*/.*
qui correspond à "tout jusqu'au premier /
( .+?/)
puis tout jusqu'au dernier /
( .*/
) et ensuite tout jusqu'à la fin ( .*
). Les parenthèses sont ce que l'on appelle des "groupes de capture". Ils nous permettent de "capturer" la chaîne de caractères correspondante et de la rendre disponible en tant que $1
, $2
, ... $N
pour autant de parenthèses que vous en avez.
Ici, nous avons donc ((.+?)/.*/)(.*)
. La première parenthèse extérieure ( ((.+?)/.*/)
) obtiennent tout jusqu'au nom du fichier, ils obtiendront donc le chemin d'accès au fichier, jusqu'au répertoire parent. Cela devient $1
. La deuxième parenthèse intérieure ( (.+?)
) capture le répertoire parent qui devient $2
. Les dernières parenthèses ( (.*)
) capture le nom du fichier.
En utilisant tout ce qui précède, nous renommons le fichier en $1$2_$3
. Il s'agit de $1
le chemin d'accès au fichier" (par ex. Aaosphaeria_arxii/all_assembly_versions/GCA_010015735.1_Aaoar1/
), alors $2
le nom du répertoire parent suivi d'un _
et enfin $3
le nom du fichier original.
Vous ne nous avez toujours pas montré quel résultat vous attendez. Si vous voulez également déplacer les fichiers hors de leurs répertoires, vous pouvez faire ceci à la place :
rename 's|((.+?)/.*/)(.*)|$2_$3|' */*/*/*fna.gz
Il en résultera ce qui suit :
$ 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