Bash 脚本检查文件是否被修改

Bash 脚本检查文件是否被修改

我尝试编写脚本来检查文件是否被修改。如果是,则应该echo "Error!",如果不是 - 脚本将继续运行。

我的剧本

#!/bin/bash
date=$(stat -c %y)$1
while true
         do date2=$(stat -c %y$1)
                if (date2 != date)
                        echo "error!"
        done

有没有错误?

答案1

您可以使用inotifywait阅读更多

inotifywait - 使用 inotify 等待文件更改

inotifywait 使用 Linux 的 inotify(7) 接口有效地等待文件更改。它适合等待 shell 脚本对文件的更改。它可以在事件发生后退出,也可以在事件发生时持续执行和输出事件。

使用这个命令:

$ inotifywait -m -e modify /tmp/testfile

当我写进时testfileinotifywait给我警报

例如;

echo "bh" > /tmp/testfile

inotifywait显示此消息:

$ inotifywait -m -e modify /tmp/testfile
Setting up watches.  
Watches established.
testfile MODIFY 
testfile MODIFY 

您也可以将输出重定向到while语句:

while read j
do
   echo "file changed"
   break
done <  <(inotifywait -q -e modify /tmp/testfile)

答案2

filename="$1"

m1=$(md5sum "$filename")

while true; do

  # md5sum is computationally expensive, so check only once every 10 seconds
  sleep 10

  m2=$(md5sum "$filename")

  if [ "$m1" != "$m2" ] ; then
    echo "ERROR: File has changed!" >&2 
    exit 1
  fi
done

答案3

如果您确实想“手动”检查修改时间戳的更改,而不是内容的实际差异,您需要:

  • stat -c %y $1始终如一地分隔空间和里面 $( ... )。更好的是,stat -c %y "$1"如果您的文件名包含空格或任何“通配符”字符,则可以使用

  • 使用经典的[ ... ]or test ...and "$var"(因为stat %y包含空格;stat %Y可以避免这种情况)或[[ ... ]]不需要引号的 bash-enhanced 进行测试 - 但不是( ... )执行完全不同的操作,即在子 shell 中执行

  • 循环之间有一些延迟,因此这不会完全占用您的系统

 #!/bin/bash 
 date=$(stat -c %y "$1")
 while sleep 1; do date2=$(stat -c %y "$1")
   if [[ $date2 != $date ]]; then echo "changed!"; break; fi
   # possibly exit [status] instead of break
   # or if you want to watch for another change, date=$date2
 done

答案4

考虑使用 md5sum,检查真实文件修改更安全。如果一个文件与另一个文件不同,这个脚本将返回“文件不同”,但是当您均衡时,它会说文件再次相等。

#!/bin/bash

loop1(){
while sleep 1 
        do 
               md5f1=$(md5sum "$1" | cut -d' ' -f1) 
               md5f2=$(md5sum "$2" | cut -d' ' -f1)
               if [ "$md5f2" != "$md5f1" ]; then 
                    echo "The files are different now." 
                    #stop loop:
                    break 
               fi
        done
}

loop2(){ 
while sleep 1 
        do 
               md5f1=$(md5sum "$1" | cut -d' ' -f1) 
               md5f2=$(md5sum "$2" | cut -d' ' -f1)
               if [ "$md5f2" == "$md5f1" ]; then 
                    echo "The files are equal again." 
                    #stop loop:
                    break 
               fi
        done
}

while true; do 
   loop1 "$1" "$2"
   loop2 "$1" "$2"
done

将其保存为自动比较并运行如下:

./autocompare file1 file2 

相关内容