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

Eli*_*ght 8 bash shell-script

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

我的剧本

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

有任何错误吗?

Bab*_*aba 15

你可以使用inotifywait阅读更多

inotifywait - 使用 inotify 等待对文件的更改

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

使用这个命令:

$ inotifywait -m -e modify /tmp/testfile
Run Code Online (Sandbox Code Playgroud)

当我写入时testfileinotifywait向我发出警报

例如;

echo "bh" > /tmp/testfile
Run Code Online (Sandbox Code Playgroud)

inotifywait 显示此消息:

$ inotifywait -m -e modify /tmp/testfile
Setting up watches.  
Watches established.
testfile MODIFY 
testfile MODIFY 
Run Code Online (Sandbox Code Playgroud)

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

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


cas*_*cas 5

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
Run Code Online (Sandbox Code Playgroud)


Luc*_*ini 0

考虑使用 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
Run Code Online (Sandbox Code Playgroud)

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

./autocompare file1 file2 
Run Code Online (Sandbox Code Playgroud)

  • 如果这是一个特别大的文件并且您计划持续监控它(过多的 I/O 和 CPU 使用率?),md5sum 可能不是一个完美的方法。 (3认同)