2016-12-05 2 views
0

J'ai des noms de fichiers tels que:noms de fichiers longs changement de nom en vrac

5_END_1033_ACAGTG_L002_R1_001.fastq.gz 
5_END_1033_ACAGTG_L002_R2_001.fastq.gz 
40_END_251_GTGAAA_L002_R1_001.fastq.gz 
40_END_251_GTGAAA_L002_R2_001.fastq.gz 

Je veux quelque chose comme:

END_1033_R1.fastq.gz 
END_1033_R2.fastq.gz 
END_251_R1.fastq.gz 
END_251_R2.fastq.gz 

Y at-il de bonnes façons de renommer ces fichiers dans linux?

Répondre

2

Vous pouvez essayer d'utiliser une boucle pour extraire la partie importante du nom de fichier:

for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done 

Cela vous donnera simplement une nouvelle liste de noms de fichiers. Vous pouvez ensuite les déplacer:

for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done 

Pour décomposer un peu:

    boucle
  • sur les fichiers * .gz
  • créer une variable qui exclut le contenu inutile du nom
  • déplacer le nom de fichier à ce nouveau nom

Je m'attends à ce qu'il y ait de meilleures façons de le faire, mais c'est ce que j'ai imaginé Du haut de ma tête.

Test:

$ ls 
40_END_251_GTGAAA_L002_R1_001.fastq.gz 40_END_251_GTGAAA_L002_R2_001.fastq.gz 5_END_1033_ACAGTG_L002_R1_001.fastq.gz 5_END_1033_ACAGTG_L002_R2_001.fastq.gz 

$ for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done 
./40_END_251_R1.fastq.gz 
./40_END_251_R2.fastq.gz 
./5_END_1033_R1.fastq.gz 
./5_END_1033_R2.fastq.gz 

$ for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done 

$ ls 
40_END_251_R1.fastq.gz 40_END_251_R2.fastq.gz 5_END_1033_R1.fastq.gz 5_END_1033_R2.fastq.gz 

Remarque que je fais cela dans bash 4.4.5

EDIT Donné Je ne suis pas tout à fait sûr que les colonnes du nom sont les plus importants , awk pourrait mieux fonctionner:

for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); echo $newname; done 

Ceci partagera le nom du fichier par _ et vous permettent de référencer les colonnes que vous voulez à l'aide $X:

for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); mv $file "${newname}.fastq.gz"; done 
+0

Merci beaucoup :) – Kisun

+0

Je viens de réaliser que cela ne fonctionne pas dans toutes les situations comme: 17_END_107A_CGATGT_L005_R1_001.fastq. gz et 29_END_4271A_ACAGTG_L008_R1_001.fastq.gz. En outre, je préférerais sortir des nombres et des premiers "_" i.e 40_, 5_, etc. – Kisun

+1

Laissez-moi voir si je peux l'ajuster :) – bedwyr