1

我正在尝试用 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;
4

3 回答 3

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 之类的工具,它们的运行效率要高得多(当事情发生变化时由操作系统通知,而不是需要定期检查。

于 2013-09-01T19:39:54.897 回答
1

不准确。在文件的 atime 和 mtime-N之间进行比较,这在例如 relatime 挂载的 ext3 文件系统上是不准确的。您应该使用操作系统的文件监控工具或直接比较文件的 mtime。

于 2013-09-01T19:31:06.507 回答
0

顺便说一句 - 如果你改变 running=false; 要退出 1、2、3,那么代码会更清晰,另一个调用它的脚本可以使用返回值来确定脚本完成的原因。

于 2013-09-01T19:39:41.857 回答