Я пытаюсь написать скрипт, который проверяет, был ли изменен файл или нет. Если да, то так и должно быть 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). Он подходит для ожидания изменений в файлах из скриптов оболочки. Он может либо завершиться после возникновения события, либо непрерывно выполняться и выводить события по мере их возникновения.
используйте эту команду:
$ 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,[[ ... ]]
которому не нужны кавычки, но не( ... )
который делает что-то совершенно другое, а именно выполняет в подоболочкенекоторая задержка между циклами, чтобы это не перегружало вашу систему
#!/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