Unix Shell脚本-循环直到找不到文件

Unix Shell脚本-循环直到找不到文件,shell,unix,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 exist

我正在写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”文件后它就停止了:

有人能帮忙吗


谢谢

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

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

您没有指定使用哪个shell。我猜是bash

  • 您应使用'['和']]'而不是'['和']'来评估'find'命令的结果是否为空
  • 您应该在“find”命令周围使用“`”,以执行并将结果提供给上面的评估
  • 以下是修改后的脚本:

    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"
    

    假设
    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"
    

    仅在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.
    
    check_dir=/home/mpcmi/cm
    my_tmp_dir=$(mktemp-d--tmpdir=/tmp)#为fifo创建一个唯一的tmp dir。
    mkfifo$my_tmp_dir/fifo#空fifo用于读取睡眠。
    发现=1
    而[[$found==1]];做
    找到=0
    对于f in$check_dir/*.inp$check_dir/*.eob;做
    [[-e$f]&&found=1&&break
    完成
    read-t1$my_tmp_dir/fifo与sleep 1相同,但没有子进程。
    完成
    rm$my_tmp_dir/fifo;rmdir$my_tmp#u dir#清理,可以在陷阱中完成。
    
    通过避免循环中的
    睡眠
    ,我不创建任何子进程,因此节省了系统资源。为了实现这一点,我必须在bash中实现我自己的
    睡眠
    ,我只发现
    读取
    ,并在fifo上超时

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

    简化逻辑:

    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" 
    

    谢谢大家的回应!问题-如何使它只在/home/mpcmi/cm目录中查找,而不深入到子目录?谢谢
    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"