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 

相關內容