É comum usar o bash shell, por exemplo, para renomear muitos arquivos em massa. Normalmente eu usei a seguinte estrutura,
for file in ./*.short
do
# do command
done
Isso é para nome de arquivo com extensão .short. Mas, agora como processar com dois ou mais nomes de variáveis (neste caso extensão de arquivo) no comando? Eu gostaria de fazer um processo em massa para o seguinte 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
Nesse caso, tenho .short e .mcep que desejo processar simultaneamente. Eu uso oelógica (&&) mas não funcionou,
for file1 in ./*.short && ./*.mcep
do
# $file1 and file2 process
done
Qualquer programador de shell experiente e qualificado deseja compartilhar como resolver isso? Tenho ideia de usar loops aninhados, mas não sei como implementar no Bash.
Responder1
Você pode percorrer o *.shorts e verificar os arquivos *.mcep correspondentes com:
#!/bin/bash
for i in *.short
do
base=${i%%?????}
if [ -e ${base}mcep ]
then
echo ${base}.short
echo ${base}.mcep
fi
done
Acabei de repetir os nomes *.short e *.mcep aqui, mas agora você pode usá-los em comandos.
Responder2
Você pode 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
Responder3
#!/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