linux - bash脚本 - 测试文件

时间:2013-09-01 19:27:48

标签: linux bash

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

3 个答案:

答案 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)

不准确。 -Nfile's atime and mtime进行了比较,{{1}}在安装了relatime的ext3文件系统。您应该使用操作系统的文件监视工具或直接比较文件的mtime。

答案 2 :(得分:0)

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