3

我正在编写 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 or inp file exists”但是当我删除我的测试“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

有人可以帮忙吗?

谢谢!

4

5 回答 5

1

您没有指定使用哪个外壳。我认为它是bash。

  1. 你应该使用'[['和']]'而不是'['和']'来评估'find'命令的结果是否为空。
  2. 你应该在'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"
于 2013-03-17T11:46:28.170 回答
1

简化你的逻辑:

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" 
于 2013-03-17T19:33:50.367 回答
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"
于 2013-03-17T16:49:32.810 回答
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循环,我不创建任何子进程,因此我节省了系统资源。sleep为了实现这一点,我必须在 bash中实现我自己的,而且我只发现read在 fifo 上有超时。

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

于 2013-03-17T17:00:03.610 回答
0

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

 if ls *.inp || ls *.eob
 then
     echo "exists"
 else
     echo "does not exist"
 fi
于 2013-03-17T11:28:23.430 回答