Unix Shell脚本-循环直到找不到文件
我正在写shell脚本。我需要检查特定目录中是否存在具有2个特定文件扩展名“eob”和“inp”的文件,如果存在,我希望留在循环中并继续检查,直到文件不存在,然后我希望中断循环并继续执行其余逻辑 下面是我到目前为止的代码,但它不工作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
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
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"