Il est courant d'utiliser bash Shell par exemple pour renommer en vrac de nombreux fichiers. Habituellement, j'utilisais la structure suivante,
for file in ./*.short
do
# do command
done
C'est pour le nom de fichier avec l'extension .short. Mais maintenant, comment traiter avec deux ou plusieurs noms de variables (dans ce cas, l'extension de fichier) dans la commande? Je voudrais faire un processus en bloc pour la commande suivante,
( 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
Dans ce cas, j'ai .short et .mcep que je veux traiter simultanément. J'utilise la logique et (&&) mais cela n'a pas fonctionné,
for file1 in ./*.short && ./*.mcep
do
# $file1 and file2 process
done
Tout programmeur Shell expérimenté et compétent veut partager comment résoudre ce problème? J'ai l'idée d'utiliser des boucles imbriquées, mais je ne sais pas comment les implémenter dans Bash.
#!/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
Vous pouvez parcourir les * .shorts, puis rechercher les fichiers * .mcep correspondants avec:
#!/bin/bash
for i in *.short
do
base=${i%%?????}
if [ -e ${base}mcep ]
then
echo ${base}.short
echo ${base}.mcep
fi
done
Je viens de répéter les noms * .short et * .mcep ici, mais vous pouvez maintenant les utiliser dans les commandes.
Vous pouvez utiliser ce 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