Es común usar bash shell, por ejemplo, para cambiar el nombre de muchos archivos de forma masiva. Normalmente utilicé la siguiente estructura,
for file in ./*.short
do
# do command
done
Eso es para nombres de archivos con extensión .short. Pero, ahora, ¿cómo procesar con dos o más nombres de variables (en este caso, extensión de archivo) en el comando? Me gustaría realizar un proceso masivo para el siguiente comando,
( x2x +sf < data.short | frame -l 400 -p 80 | \
bcut +f -l 400 -s 65 -e 65 |\
window -l 400 -L 512 | spec -l 512 |\
glogsp -l 512 -x 8 -p 2 ;\
\
bcut +f -n 20 -s 65 -e 65 < data.mcep |\
mgc2sp -m 20 -a 0.42 -g 0 -l 512 | glogsp -l 512 -x 8 ) | xgr
En ese caso tengo .short y .mcep que quiero procesar al mismo tiempo. Yo uso elylógica (&&) pero no funcionó,
for file1 in ./*.short && ./*.mcep
do
# $file1 and file2 process
done
¿Algún programador de shell experimentado y capacitado quiere compartir cómo resolver esto? Tengo idea de utilizar bucles anidados, pero no sé cómo implementarlos en Bash.
Respuesta1
Puede recorrer los *.shorts y luego buscar los archivos *.mcep correspondientes con:
#!/bin/bash
for i in *.short
do
base=${i%%?????}
if [ -e ${base}mcep ]
then
echo ${base}.short
echo ${base}.mcep
fi
done
Acabo de repetir los nombres *.short y *.mcep aquí, pero ahora puedes usarlos en los comandos.
Respuesta2
Puedes usar este script
#!/bin/bash
for file1 in /path/to/files/*
do
ext=${file#*.}
if [[ "$ext" == "mcep" ]]
then
#command to run on files with 'mcep' extension
elif [[ "$ext" == "short" ]]
then
#command to run on files with 'short' extension
fi
done
Respuesta3
#!/bin/bash
for file in ./*.short
do
(x2x +sf < $file | frame -l 400 -p 80 |
bcut +f -l 400 -s 65 -e 65 |
window -l 400 -L 512 | spec -l 512 |
glogsp -l 512 -x 8 -p 2 ;\
bcut +f -n 20 -s 65 -e 65 < ${file%.short}.mcep |\
mgc2sp -m 20 -a 0.42 -g 0 -l 512 | glogsp -l 512 -x 8 ) | psgr > ${file%.short}.eps
done