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). Он подходит для ожидания изменений в файлах из скриптов оболочки. Он может либо завершиться после возникновения события, либо непрерывно выполняться и выводить события по мере их возникновения.

используйте эту команду:

$ 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"это будет работать, если имя файла содержит пробел или любой символ подстановки.

  • протестируйте с помощью классического [ ... ]or test ...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 

Связанный контент