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
, inotifywait
me alarma
p.ej;
echo "bh" > /tmp/testfile
inotifywait
muestra este mensaje:
$ inotifywait -m -e modify /tmp/testfile
Setting up watches.
Watches established.
testfile MODIFY
testfile MODIFY
También puedes redirigir la salida a while
la 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 $1
consecuentementeconlos 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
[ ... ]
otest ...
y"$var"
(porquestat %y
contiene espacios;stat %Y
lo evitaría) o bash mejorado[[ ... ]]
que no necesita comillas, pero no,( ... )
que hace algo completamente diferente, es decir, ejecutar en una subcapaalgo 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