Para arquivos que não são diferentes, qualquer método exigirá a leitura completa dos dois arquivos, mesmo que a leitura tenha sido no passado.
Não ha alternativa. Portanto, criar hashes ou somas de verificação em algum momento requer a leitura de todo o arquivo. Arquivos grandes levam tempo.
A recuperação de metadados do arquivo é muito mais rápida que a leitura de um arquivo grande.
Portanto, existem metadados de arquivo que você pode usar para estabelecer que os arquivos são diferentes? Tamanho do arquivo ? ou até mesmo resultados do comando file, que lê apenas uma pequena parte do arquivo?
Fragmento de código de exemplo de tamanho de arquivo:
ls -l $1 $2 |
awk 'NR==1{a=$5} NR==2{b=$5}
END{val=(a==b)?0 :1; exit( val) }'
[ $? -eq 0 ] && echo 'same' || echo 'different'
Se os arquivos forem do mesmo tamanho, você ficará com as leituras completas do arquivo.