循环执行脚本直到文件存在

循环执行脚本直到文件存在

我试图让脚本在 /tmp 中查找一个名为 sleep.txt 的文件,但它却一直在循环

以下是我所拥有的:

#!/bin/sh

set -x
until [ $(ls -la | grep -w "sleep.txt" | wc -l) != 0 ];
do
        echo "Sleep.txt doesn't exist as of yet..."
done
        echo "Sleep.txt now exists!!!"
        sleep 2
exit

答案1

此脚本不使用轮询。换句话说,它不进行定期检查。相反,它使用一个工具,inotifywait,旨在监视文件系统的变化。

在此脚本中,inotifywait监视当前目录 ( .)。每次在该目录中创建文件时,inotifywait都会发出其名称,并且脚本会检查它是否匹配sleep.txt。如果匹配,它会宣布创建:

[ -e sleep.txt ] || while IFS= read -r fname
do_
    [ "$fname" = sleep.txt ] && break
done < <(inotifywait -m -q -e create -e moved_to --format %f .)

echo "Finally, sleep.txt now exists!!!"

更多细节

所用的选项inotifywait含义如下:

  • -m表示持续监控目录。换句话说,在第一次发生值得报告的事情时不要停止。

  • -q意味着比平时更安静。

  • -e create -e moved_to 表示仅报告在此目录中创建或移动的文件。

  • --format %f告诉它每次发生文件创建事件时打印文件名

  • .告诉它要监视哪个目录。句点.始终表示当前目录。

安装inotifywait

在类似 Debian 的系统上,inotifywait它是软件包的一部分inotify-tools,可以通过以下方式安装:

apt-get install inotify-tools

有关其他 Linux 发行版的安装说明,请参阅inotify-tools 的 wiki。如果您需要源代码,请参阅github 上的 inotify-tools 包。

MS Windows 和 OSX

inotifywait适用于 Linux 系统并可在 Cygwin 下运行。

要了解适用于 Windows 的类似工具,点击这里

有关 Mac OSX 类似工具的信息,点击这里

答案2

解析ls 不是一个好主意

相反,您可以使用-e测试来检查文件是否存在:

#!/bin/sh

until [ -e sleep.txt ]; do
    echo "sleep.txt doesn't exist as of yet..."
    sleep 1
done

echo "sleep.txt now exists!!!"
sleep 2

咨询man test有关命令的更多信息test

相关内容