我尝试编写脚本来检查文件是否被修改。如果是,则应该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