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

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

Tento escrever um script para verificar se um arquivo foi modificado ou não. Se sim, deveria echo "Error!", se não - o script continua em execução.

Meu roteiro

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

Há algum erro?

Responder1

você pode usar inotifywait,consulte Mais informação

inotifywait - aguarde alterações nos arquivos usando inotify

inotifywait espera com eficiência por alterações nos arquivos usando a interface inotify(7) do Linux. É adequado para aguardar alterações em arquivos de scripts de shell. Ele pode sair quando um evento ocorre ou executar e gerar eventos continuamente à medida que ocorrem.

use este comando:

$ inotifywait -m -e modify /tmp/testfile

quando escrevo testfile, inotifywaitme alarmo

por exemplo;

echo "bh" > /tmp/testfile

inotifywaitmostre 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 whilea instrução:

while read j
do
   echo "file changed"
   break
done <  <(inotifywait -q -e modify /tmp/testfile)

Responder2

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

Responder3

Se você quiser verificar 'manualmente' as alterações no carimbo de data e hora da modificação, em vez da diferença real no conteúdo, você precisa:

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

  • teste com clássico [ ... ]ou test ...e "$var"(porque stat %ycontém espaços; stat %Yevitaria isso) ou aprimorado por bash [[ ... ]]que não precisa de aspas - mas não ( ... )que faz algo completamente diferente, ou seja, executa em um subshell

  • algum atraso entre os loops para que isso não sobrecarregue 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

Responder4

Considere usar md5sum, é mais seguro verificar modificações reais de arquivos. Este script retornará "Os arquivos são diferentes" se um arquivo divergir do outro, mas quando você equalizar, 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 comparação automática e execute como:

./autocompare file1 file2 

informação relacionada