Unix Shell Scripting - 循环直到找不到文件

时间:2013-03-17 11:16:27

标签: shell unix

我正在编写shell脚本。我需要检查具有2个特定文件扩展名“eob”和“inp”的文件存在的特定目录,如果存在,我想保持循环并继续检查,直到文件不存在,然后我想从我的循环中断并继续其余的逻辑。

以下是我到目前为止的代码,但它无效...

while true
do
  [ ! find /home/mpcmi/cm -type f \( -name "*.eob" -o -name "*.inp" \) ] && break
  echo "eob or inp file exists"
  sleep 2
done
echo "eob or inp file doesn't exists" 

首先,我在运行脚本时收到此错误:

"/home/mpcmi/cm: unknown test operator"

其次,它正确地检查并找到具有这些扩展名的文件,因为我得到输出:“eob或inp文件存在”但是当我删除我的测试“eob”和“inp”文件时脚本没有似乎检测到它,它停止打印“eob或inp文件存在”但它永远不会打印“eob或inp文件不存在”

以下是整个输出,然后在我删除测试“eob”和“inp”文件后停止:

employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator
eob or inp file exists

有人可以帮忙吗?

谢谢!

5 个答案:

答案 0 :(得分:1)

您没有指定使用哪个shell。我认为这是bash。

  1. 您应使用'[['和']]'代替'['和']'来评估'find'命令的结果是否为空。
  2. 你应该在'find'命令周围使用'`'来执行并将结果提供给上面的评估。
  3. 以下是修改过的脚本:

    while true
    do
      [[ ! `find /home/smb -type f \( -name "*.eob" -o -name "*.inp" \)` ]] && break
      echo "eob or inp file exists"
      sleep 2
    done
    echo "eob or inp file doesn't exists"
    

答案 1 :(得分:1)

假设bash并且文件不在子目录

shopt -s nullglob
while true; do
    unset f
    f=( /home/mpcmi/cm/*.{eob,inp} )
    if (( ${#f[@]} > 0 )); then
        echo "${#f[@]} eob or inp files present"
        sleep 2
    else
        break
    fi
done
echo "no eob or inp files"

答案 2 :(得分:0)

如果存在.inp或.eob的文件,则此打印存在,否则不存在。

 if ls *.inp || ls *.eob
 then
     echo "exists"
 else
     echo "does not exist"
 fi

答案 3 :(得分:0)

仅在bash中,不在循环中创建子流程:

check_dir=/home/mpcmi/cm

my_tmp_dir=$(mktemp -d --tmpdir=/tmp)    # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo                  # Empty fifo for sleep by read.

found=1
while [[ $found == 1 ]]; do
  found=0
  for f in $check_dir/*.inp $check_dir/*.eob; do
    [[ -e $f ]] && found=1 && break
  done
  read -t 1 <> $my_tmp_dir/fifo          # Same as sleep 1, but without sub-process.
done

rm $my_tmp_dir/fifo; rmdir $my_tmp_dir   # Cleanup, could be done in a trap.

通过避免循环sleep,我不创建任何子进程,因此我正在保存系统资源。要实现这一点,我必须在bash中实现自己的sleep,而我只发现read在fifo上超时。

您可以使用trap进行清理来改进此脚本。

答案 4 :(得分:0)

简化你的逻辑:

while find /home/mpcmi/cm -type f \( -name "*.eob" -o -name "*.inp" \) | 
    grep -q . ; do
  echo "eob or inp file exists"
  sleep 2
done
echo "No extant eob or inp files"