2012-01-17 15 views
15

Necesito cambiar el nombre de 45 archivos, y no quiero hacerlo uno por uno. Estos son los nombres de archivo:Cambiar el nombre de archivos múltiples con un bucle bash

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 

Necesito cambiar la extensión ".fasta" a ".fa". Estoy tratando de escribir un script bash para hacerlo:

for i in $(ls chr*) 

do 

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

mv $i $NEWNAME 

done 

Pero no funciona. ¿Puedes decirme por qué o dar otra solución rápida?

Gracias!

Respuesta

20

Varios errores aquí:

  • NEWNAME = deben entenderse sin espacio. Aquí bash busca un comando llamado NEWNAME y falla.
  • se analiza la salida de ls. esto es malo si tienes archivos con espacios. Bash puede compilar una lista de archivos con el operador glob *.
  • No escapa "$i" y "$NEWNAME". Si alguno de ellos contiene un espacio, hace dos argumentos para mv.
  • Si un nombre de archivo comienza con un guión mv creerá que se trata de un cambio. Use -- para detener el procesamiento de argumentos.

Probar:.

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

o

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

El "%{var/%pat/replacement} "mira para patsólo al final de la variable y lo reemplaza con replacement

+0

que no debería haber eliminado mi comentario, pero vi que había respondido anteriormente. Gracias. – nickd

+0

nice, usando '/%' y '-' para 'mv'. Probablemente incluiría la extensión en el bucle 'for',' for i in chr * .fasta' – c00kiemon5ter

+0

¡Gracias por tu respuesta completa! – Geparada

7
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done 
+0

no funcionará si los archivos tienen espacios en sus nombres. – Benoit

+0

+1, variedad de elección – bobah

+0

aunque esto funcionaría con los datos dados, ¿qué pasa con los espacios en los archivos, o los archivos que contienen '.fasta' en su nombre de archivo y no solo como su extensión? muchas cosas pueden salir mal aquí – c00kiemon5ter

6

Si usted tiene el comando rename, que puede hacer:

rename .fasta .fa chr*.fasta 
+0

Usaré este comando para la próxima vez, ¡gracias! – Geparada

Cuestiones relacionadas