例如,使用 bash shell 批量重命名大量文件是很常见的。通常我使用以下结构,
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
有没有经验丰富且熟练的 shell 程序员愿意分享如何解决这个问题?我有使用嵌套循环的想法,但我不知道如何在 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