循环脚本直到文件存在

Cid*_*icc 3 bash shell-script

我正在尝试让脚本在 /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
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 8

此脚本不使用轮询。换句话说,它不进行定期检查。相反,它使用一个工具 ,该工具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!!!"
Run Code Online (Sandbox Code Playgroud)

更多细节

用于的选项inotifywait具有以下含义:

  • -m意味着继续监视目录。换句话说,不要在第一次发生值得报告的事情时停下来。

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

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

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

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

安装 inotifywait

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

apt-get install inotify-tools
Run Code Online (Sandbox Code Playgroud)

MS Windows 和 OSX

inotifywait 可用于 Linux 系统,也可在 Cygwin 下运行。

要了解适用于 Windows 的类似工具,请单击此处

有关适用于 Mac OSX 的类似工具的信息,请单击此处

  • +1 显然它需要包 `inotify-tools`,至少在 Linux Mint 上是这样,尽管 inotify 是内核的一部分。并且 inotifywait 似乎在脚本退出后继续运行一段时间,至少一分钟左右,直到在目录中创建另一个文件......在另一个终端中使用 pgrep 进行测试。 (2认同)

mpy*_*mpy 6

解析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
Run Code Online (Sandbox Code Playgroud)

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

  • 只是一个小注释:“[[”是 Bash 特定的,因此您可能想要将 shebang 行更改为“#!/bin/bash”,或者将双括号替换为单括号“[”和“]”。(此外,缩进有点令人困惑。) (2认同)