Você pode recursivamente gerar todos os hashes, concatenar os hashes em um único arquivo e gerar um hash desse arquivo.
Estou interessado em armazenar um indicador de integridade de arquivos / diretórios entre duas cópias arquivadas de diretórios. São cerca de 1 TB de dados armazenados recursivamente em discos rígidos. Existe uma maneira de usar o OpenSSL para gerar um único hash para todos os arquivos que podem ser usados como comparação entre duas cópias dos dados ou, posteriormente, para verificar se os dados não foram alterados?
Você não pode fazer um hash cumulativo de todos eles para criar um único hash, mas você pode compactá-los primeiro e depois calcular o hash:
$tar -czpf archive1.tar.gz folder1/
$tar -czpf archive2.tar.gz folder2/
$openssl md5 archive1.tar.gz archive2.tar.gz
para recursivamente hash cada arquivo:
$find . -type f -exec openssl md5 {} +
Fazer uma soma md5 no tar nunca funcionaria, a menos que todos os metadados (data de criação, etc.) fossem idênticos também, porque o tar armazena isso como parte de seu archive.
Eu provavelmente faria uma soma md5 do conteúdo de todos os arquivos:
find folder1 -type f | sort | tr '\n' 'find folder1 -type f | sort | tr '\n' '%pre%' | xargs -0 cat | openssl md5
find folder2 -type f | sort | tr '\n' '%pre%' | xargs -0 cat | openssl md5
' | xargs -0 cat | openssl md5
find folder2 -type f | sort | tr '\n' '%pre%' | xargs -0 cat | openssl md5
Você provavelmente deveria estar interessado em produzir o resumo no formato coreutils (idêntico ao md5sum -b)
Então, o comando md5sum poderia ser:
find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' 'find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' 'find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' 'find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' '%pre%' | xargs -0 openssl dgst -md5 -r > ../mydigest.md5
' | xargs -0 openssl dgst -md5 -r
' | xargs -0 openssl dgst -md5 -r > ../mydigest.md5
' | xargs -0 openssl dgst -md5 -r
ou com uma saída para um arquivo
%pre%