Bash-Shell für Loop-Prozess mit zwei gepaarten Variablennamen

Bash-Shell für Loop-Prozess mit zwei gepaarten Variablennamen

Es ist üblich, die Bash-Shell zu verwenden, um beispielsweise viele Dateien umzubenennen. Normalerweise verwende ich die folgende Struktur:

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

Das gilt für Dateinamen mit der Erweiterung .short. Aber wie verarbeite ich nun zwei oder mehr Variablennamen (in diesem Fall Dateierweiterungen) im Befehl? Ich möchte eine Massenverarbeitung für den folgenden Befehl durchführen:

( 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

In diesem Fall habe ich .short und .mcep, die ich gleichzeitig verarbeiten möchte. Ich verwende dieUndLogik (&&), aber es hat nicht funktioniert,

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

Möchte ein erfahrener und kompetenter Shell-Programmierer mitteilen, wie man das löst? Ich habe eine Idee, verschachtelte Schleifen zu verwenden, weiß aber nicht, wie man sie in Bash implementiert.

Antwort1

Sie können die *.shorts-Dateien durchlaufen und dann mit folgendem Befehl nach entsprechenden *.mcep-Dateien suchen:

#!/bin/bash

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

Ich habe hier nur die Namen *.short und *.mcep wiederholt, aber Sie können sie jetzt in Befehlen verwenden.

Antwort2

Sie können dieses Skript verwenden

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

Antwort3

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

verwandte Informationen