我嘗試編寫腳本來檢查文件是否已修改。如果是,則應該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
當我寫進時testfile
,inotifywait
給我警報
例如;
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"
如果您的檔案名稱包含空格或任何“通配符”字符,則可以使用使用經典的
[ ... ]
ortest ...
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