我正在尝试用bash创建一个脚本。如果文件不存在,该脚本应该以提示退出,或者如果它确实退出,它将在修改或退出后退出。参数$ 1用于文件名,参数$ 2用于每次检查之间的时间间隔。使用-N检查文件是否被修改是否足够? 到目前为止的代码(我正在处理的一些小错误):
#!/bin/bash
running=true;
while[ $running ]
do
if [ ! -f $1 ]; then
echo "File: $1 does not exist!"
running=false;
fi
if [ -f $1 ]; then
if [ ! -N $1 ]; then
sleep [ $2 ]
fi;
elif [ -N $1 ]; then
echo "File: $1 has been modified!"
running=false;
fi;
fi;
done;
答案 0 :(得分:3)
我假设您只定位安装了GNU stat的平台。
#!/bin/bash
file="$1"
sleep_time="$2"
# store initial modification time
[[ -f $file ]] || \
{ echo "ERROR: $1 does not exist" >&2; exit 1; }
orig_mtime=$(stat --format=%Y "$file")
while :; do
# collect current mtime; if we can't retrieve it, it's a safe assumption
# that the file is gone.
curr_mtime=$(stat --format=%Y "$file") || \
{ echo "File disappeared" >&2; exit 1; }
# if current mtime doesn't match the new one, we're done.
(( curr_mtime != orig_mtime )) && \
{ echo "File modified" >&2; exit 0; }
# otherwise, delay before another time around.
sleep "$sleep_time"
done
也就是说,在一个理想的世界中,你不会自己编写这种代码 - 相反,你会使用inotifywait这样的工具,它们的运行效率更高(由操作系统通知)当事情发生变化时,而不是需要定期检查。
答案 1 :(得分:1)
不准确。 -N
对file's atime and mtime进行了比较,{{1}}在安装了relatime的ext3文件系统。您应该使用操作系统的文件监视工具或直接比较文件的mtime。
答案 2 :(得分:0)
顺便说一句 - 如果你改变running = false;要退出1,2,3,代码会更清晰,另一个调用它的脚本可以使用返回值来确定脚本完成的原因。