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
, inotifywait
me alarmo
por exemplo;
echo "bh" > /tmp/testfile
inotifywait
mostre 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
a 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 $1
consistentementecomos 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
[ ... ]
outest ...
e"$var"
(porquestat %y
contém espaços;stat %Y
evitaria isso) ou aprimorado por bash[[ ... ]]
que não precisa de aspas - mas não( ... )
que faz algo completamente diferente, ou seja, executa em um subshellalgum 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