2 つのペアの変数名を持つ Bash シェルのループ処理

2 つのペアの変数名を持つ Bash シェルのループ処理

たとえば、多数のファイルを一括で名前変更するには、bash シェルを使用するのが一般的です。通常、私は次の構造を使用します。

for file in ./*.short
do
# do command
done

これは .short 拡張子のファイル名用です。しかし、コマンドで 2 つ以上の変数名 (この場合はファイル拡張子) を処理するにはどうすればよいでしょうか。次のコマンドで一括処理を行いたいと思います。

( 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

この場合、.shortと.mcepを同時に処理したいので、そしてロジック(&&)ですが、機能しませんでした。

for file1 in ./*.short && ./*.mcep
do
# $file1 and file2 process
done

経験豊富で熟練したシェル プログラマーの皆さん、この問題を解決する方法を共有していただけませんか? ネストされたループを使用するアイデアはありますが、Bash で実装する方法がわかりません。

答え1

次のようにして、*.shorts をループし、対応する *.mcep ファイルをチェックできます。

#!/bin/bash

for i in *.short
do
   base=${i%%?????}
   if [ -e ${base}mcep ]
   then
      echo ${base}.short
      echo ${base}.mcep
   fi
done

ここでは *.short および *.mcep の名前をエコーし​​ましたが、コマンドでも使用できるようになりました。

答え2

このスクリプトを使うことができます

#!/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

答え3

#!/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

関連情報