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