如何在shell脚本的while循环中检查带有通配符的文件

时间:2013-03-18 10:59:38

标签: bash shell while-loop

我正在编写一个bash shell脚本,只要文件存在,我就想实现一个睡眠序列。现在,在最简单的情况下,这就像:

while [ -f fileName ]
do
echo "waiting"
sleep 1
done

现在,在我的情况下,第一个问题如下:我想在fileName中使用通配符。这可以通过以下方式解决:

fileName="$path/$prefix*$suffix" 
while [ -f $fileName ]
    do
    echo "waiting"
    sleep 1
done

但是,如果多个文件与fileName

匹配,则会失败
./testWait.sh: line 11: [: /home/nrc11/egsnrc/BEAM_TB_jaws/130318110457_s.lock: binary operator expected

我该如何解决这个问题?

这是(半)具体的例子:

#!/bin/bash -u

timeStamp="130318110457"
echo "prefix of files: $timeStamp"

beamDir=$(awk '{ print $0 }' $timeStamp/$timeStamp.beamDir)
file="$EGS_HOME$beamDir/$timeStamp*.lock" 

echo $file

while [ -f $file ]
do
    echo "waiting"
    sleep 1
done

2 个答案:

答案 0 :(得分:1)

您可以在展开的通配符上使用grep来验证它在时间戳之后返回的内容不是星号:

while echo $file | grep "^$EGS_HOME$beamDir/$timeStamp"'[^*]' ; do
    echo "Waiting..."
    sleep 1
done

答案 1 :(得分:-1)

我非常关注这个,我尝试做这个很久以后,我使用了一些名为inotify的东西,一个在Linux中的软件包,试一试,它实际上让你的生活更轻松。