web-dev-qa-db-fra.com

Renommer plusieurs fichiers avec une boucle bash

J'ai besoin de renommer 45 fichiers et je ne veux pas le faire un par un. Ce sont les noms de fichiers:

chr10.fasta         chr13_random.fasta  chr17.fasta         chr1.fasta          chr22_random.fasta  chr4_random.fasta  chr7_random.fasta  chrX.fasta
chr10_random.fasta  chr14.fasta         chr17_random.fasta  chr1_random.fasta   chr2.fasta          chr5.fasta         chr8.fasta         chrX_random.fasta
chr11.fasta         chr15.fasta         chr18.fasta         chr20.fasta         chr2_random.fasta   chr5_random.fasta  chr8_random.fasta  chrY.fasta
chr11_random.fasta  chr15_random.fasta  chr18_random.fasta  chr21.fasta         chr3.fasta          chr6.fasta         chr9.fasta         
chr12.fasta         chr16.fasta         chr19.fasta         chr21_random.fasta  chr3_random.fasta   chr6_random.fasta  chr9_random.fasta
chr13.fasta         chr16_random.fasta  chr19_random.fasta  chr22.fasta         chr4.fasta          chr7.fasta         chrM.fasta

Je dois changer l'extension ".fasta" en ".fa". J'essaie d'écrire un script bash pour le faire:

for i in $(ls chr*)

do

NEWNAME = `echo $i | sed 's/sta//g'`

mv $i $NEWNAME

done

Mais ça ne marche pas. Pouvez-vous me dire pourquoi ou donner une autre solution rapide?

Merci!

21
Geparada

Plusieurs erreurs ici:

  • NEWNAME = devrait être sans espace. Ici, bash recherche une commande nommée NEWNAME et cela échoue.
  • vous analysez la sortie de ls. c'est mauvais si vous aviez des fichiers avec des espaces. Bash peut se construire une liste de fichiers avec l'opérateur glob *.
  • Vous n'échappez pas "$i" et "$NEWNAME". Si l'un d'eux contient un espace, il fait deux arguments pour mv.
  • Si un nom de fichier commence par un tiret, mv croira qu'il s'agit d'un commutateur. Utilisation -- pour arrêter le traitement des arguments.

Essayer:

for i in chr*
do
  mv -- "$i" "${i/%.fasta/.fa}"
done

ou

for i in chr*
do
  NEWNAME="${i/%.fasta/.fa}"
  mv -- "$i" "$NEWNAME"
done

Le "%{var/%pat/replacement} "recherche patniquement à la fin de la variable et la remplace par replacement.

30
Benoit
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
9
Chris Dodd

Si vous avez la commande rename , vous pouvez faire:

rename .fasta .fa chr*.fasta
7
dogbane