Como faço para atualizar facilmente a lista de md5sums?

3

Às vezes, uso um meio não confiável (flash) para armazenar uma boa quantidade de dados. Para pelo menos reconhecer bit flips eu armazeno um arquivo com o md5sums ao lado. Este arquivo geralmente é criado por uma variação de find -type f -exec "{}" \; >MD5SUM . Mais tarde, copio mais alguns arquivos e agora gostaria de adicionar as somas de verificação dos novos arquivos sem precisar recalcular as antigas. Infelizmente, o tempo de algumas máquinas que uso são parafusadas, então usar find -newer <file> -exec md5sum "{}"\; >>MD5SUM não é uma opção. Basicamente gostaria de obter a diferença entre a lista de arquivos criada por find -type f e a lista no arquivo MD5SUM.

Alguma idéia de como fazer isso de maneira fácil e elegante? Obrigado antecipadamente!

    
por antje-m 18.02.2012 / 01:04

3 respostas

2

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.

    
por 18.02.2012 / 02:34
2

Acho que a maneira mais fácil seria armazenar a soma de verificação do arquivo _my_file_ no arquivo _my_file_.md5 evitando armazenar toda a soma de verificação em um único arquivo. Dessa forma, é muito mais simples saber se uma soma de verificação já foi um computador antes.

No entanto, se você adicionar apenas arquivos à sua unidade flash (nunca modificar, excluir, mas nunca adicionar um arquivo que já existia antes), você poderá:

find _your_drive_path_ -type f |
  while read file; do
    grep -q $file _your_md5_file_ || md5sum $file >> _your_md5_file_
  done

Este grep do seu arquivo de soma de verificação muitas vezes pode ser otimizado ordenando a lista de arquivos e mantendo seu arquivo de soma de verificação ordenado no nome do arquivo, mas se você não precisa dessa otimização, por que se incomodar com sua complexidade ...

    
por 18.02.2012 / 12:35
0

Se você não pode confiar nos timestamps, então não há como processar apenas os arquivos que foram alterados. Apenas repita seu comando original find .

Eu salvaria o novo arquivo MD5SUM em um local temporário e, em seguida, diff os arquivos antigos e novos para ver o que mudou antes de copiar o arquivo atualizado para o flash. Talvez seja necessário classificar o arquivo para obter um diff útil.

    
por 18.02.2012 / 01:33