我试图让脚本在 /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
。