Script Bash para comprobar si un archivo se modifica o no

Script Bash para comprobar si un archivo se modifica o no

Intento escribir un script para comprobar si un archivo se modificó o no. Si fue así, debería hacerlo echo "Error!"; si no, el script sigue ejecutándose.

mi guión

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

¿Hay algún error?

Respuesta1

puedes usar inotifywait,leer más

inotifywait: espera cambios en los archivos usando inotify

inotifywait espera eficientemente cambios en los archivos usando la interfaz inotify(7) de Linux. Es adecuado para esperar cambios en archivos desde scripts de shell. Puede salir una vez que ocurre un evento o ejecutar y generar eventos continuamente a medida que ocurren.

usa este comando:

$ inotifywait -m -e modify /tmp/testfile

cuando escribo testfile, inotifywaitme alarma

p.ej;

echo "bh" > /tmp/testfile

inotifywaitmuestra este mensaje:

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

También puedes redirigir la salida a whilela declaración:

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

Respuesta2

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

Respuesta3

Si desea verificar 'manualmente' si hay cambios en la marca de tiempo de modificación, en lugar de la diferencia real en el contenido, necesita:

  • stat -c %y $1consecuentementeconlos espacios de separación yadentro $( ... ). Aún mejor, stat -c %y "$1"funcionará si su nombre de archivo contiene espacios en blanco o cualquier carácter "globbing"

  • pruebe con el clásico [ ... ]o test ...y "$var"(porque stat %ycontiene espacios; stat %Ylo evitaría) o bash mejorado [[ ... ]]que no necesita comillas, pero no, ( ... )que hace algo completamente diferente, es decir, ejecutar en una subcapa

  • algo de retraso entre bucles para que esto no acapare completamente su 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

Respuesta4

Considere usar md5sum, es más seguro verificar modificaciones de archivos reales. Este script devolverá "Los archivos son diferentes" si un archivo difiere del otro, pero cuando lo ecualice, dirá que los archivos son iguales nuevamente.

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

Guárdelo como comparación automática y ejecútelo como:

./autocompare file1 file2 

información relacionada