web-dev-qa-db-fra.com

Bash Shell pour le processus de boucle avec deux noms de variables appariés

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.

1
bagustris
#!/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
0
bagustris

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.

1
Julian Stirling

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
1
Rumesh