example - Renombrar archivos mĂșltiples con un bucle bash
bash script example (3)
Necesito cambiar el nombre de 45 archivos, y no quiero hacerlo uno por uno. Estos son los nombres de archivo:
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!
Si tiene el comando de rename
, puede hacer:
rename .fasta .fa chr*.fasta
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
Varios errores aquí:
-
NEWNAME =
debería estar sin espacio. Aquí bash busca un comando llamadoNEWNAME
y falla. - usted 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 se escapa de
"$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. Usar--
para detener el procesamiento de argumentos.
Tratar:
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}
" busca solo pat
al final de la variable y la reemplaza con replacement
.