Se este for um processo em andamento, você precisará de dois arquivos, o antigo e o novo (que se tornariam antigos para a próxima vez).
#!/bin/sh
# change directory to either first argument or to current directory
cd ${1:-"."} || exit 1 # if cannot cd, then exit
# get the md5 values for all the files in the directory tree
find . -type f -not -name .md5sum.last -exec md5sum {} \; | sort > .md5sum.tmp
# if called before, then get only the differences in the newer
if [ -f .md5sum.last ]; then
comm -13 .md5sum.last .md5sum.tmp
else # otherwise show all the output
cat .md5sum.tmp
fi
# replace the older with the current for next time
mv .md5sum.tmp .md5sum.last
Os sort
e comm -13
são a chave. A classificação é óbvia, mas comm
(abreviação de "comum") mostrará as linhas que estão no primeiro arquivo (coluna 1), no segundo arquivo (coluna 2) ou em ambos (coluna 3). A opção -13
diz para "remover a coluna um e três", deixando apenas as linhas que não são apenas as mais antigas e não são comuns a ambas. Infelizmente, se você não pode confiar nas marcações de hora nos arquivos, isso seria um processo muito intenso para grandes árvores de diretórios.