두 쌍의 변수 이름이 있는 루프 프로세스용 Bash 쉘

두 쌍의 변수 이름이 있는 루프 프로세스용 Bash 쉘

예를 들어 많은 파일의 이름을 대량으로 바꾸려면 bash 쉘을 사용하는 것이 일반적입니다. 일반적으로 다음 구조를 사용했습니다.

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

확장자가 .short인 파일 이름입니다. 하지만 이제 명령에서 두 개 이상의 변수 이름(이 경우 파일 확장자)을 처리하는 방법은 무엇입니까? 다음 명령에 대해 대량 처리를 수행하고 싶습니다.

( 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

관련 정보