Script de bash para verificar se um arquivo foi modificado ou não

4

Eu tento escrever script para verificar se um arquivo foi modificado ou não. Se assim fosse, deveria echo "Error!" , se não - o script continua rodando.

Meu script

#!/bin/bash
date=$(stat -c %y)$1
while true
         do date2=$(stat -c %y$1)
                if (date2 != date)
                        echo "error!"
        done

Há algum erro?

    
por Elisia Light 02.06.2016 / 16:44

4 respostas

14

você pode usar inotifywait , leia mais

inotifywait - wait for changes to files using inotify

inotifywait efficiently waits for changes to files using Linux's inotify(7) interface. It is suitable for waiting for changes to files from shell scripts. It can either exit once an event occurs, or continually execute and output events as they occur.

use este comando:

$ inotifywait -m -e modify /tmp/testfile

quando eu escrevo em testfile , inotifywait alarm para mim

por exemplo:

echo "bh" > /tmp/testfile

inotifywait mostrar esta mensagem:

$ inotifywait -m -e modify /tmp/testfile
Setting up watches.  
Watches established.
testfile MODIFY 
testfile MODIFY 

você também pode redirecionar a saída para while statement:

while read j
do
   echo "file changed"
   break
done <  <(inotifywait -q -e modify /tmp/testfile)
    
por 03.06.2016 / 04:23
4
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
    
por 03.06.2016 / 04:06
0

Considere usar md5sum, é mais seguro verificar as modificações reais dos arquivos. Este script retornará "Os arquivos são diferentes" se um arquivo divergir do outro, mas quando você equalizar, ele dirá que os arquivos são iguais novamente.

#!/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

Salve-o como autocompare e execute como:

./autocompare file1 file2 
    
por 02.06.2016 / 16:56
0

Se você quiser "manualmente" verificar a alteração no registro de data e hora da modificação, ao contrário da diferença real no conteúdo, será necessário:

  • stat -c %y $1 consistentemente com os espaços de separação e dentro $( ... ) . Melhor ainda, stat -c %y "$1" funcionará se o seu nome de arquivo contiver espaço em branco ou qualquer caractere 'globbing'

  • teste com o clássico [ ... ] ou test ... e "$var" (porque stat %y contém espaços; stat %Y evitaria isso) ou% bash-enhanced[[ ... ]] que não precisa de citações - mas não ( ... ) , que faz algo completamente diferente, ou seja, executar em uma subshell

  • algum atraso entre loops para que isso não oculte completamente o seu sistema

 #!/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
    
por 04.06.2016 / 10:54