Em um contexto de linha de comando Unix, gostaria de comparar dois arquivos realmente grandes (cerca de 1 TB cada), preferivelmente com um indicador de progresso.
Eu tentei diff
e cmp
, e ambos travaram o sistema (macOS Mojave), muito menos me dando uma barra de progresso.
Qual é a melhor maneira de comparar esses arquivos muito grandes?
Detalhes adicionais:
Eu só quero verificar se eles são idênticos.
cmp
travou o sistema de uma forma que o sistema reiniciou sozinho. :-( Talvez o sistema ficou sem memória?
Se você deseja obter informações sobre o fato de serem idênticos ou não, uma maneira possível é usar hash. Comando como este lhe dará
sha1
hash de arquivos:O resultado esperado é algo como:
Você pode usar
pv
como um indicador de progresso e canalizá-lo para ashasum
função para verificar o hash para ver se eles são idênticos.Você pode estimar o tempo total cortando alguns GB de cada arquivo, cronometrando-o e aumentando a escala adequadamente. Uma barra de progresso também precisa contar bytes -- ela pode estender o tempo em 50% sozinha.
Na verdade, você pode usar um loop para cortar os arquivos em 100 seções (usando dd, ou head -c + tail -c, com pipes), usar sua ferramenta de comparação preferida e relatar cada seção.
Vantagens:
(a) Fornece um relatório de progresso em intervalos de 1%.
(b) Se houver diferenças no início, você obtém sua resposta mais cedo e pode sair do loop sem verificar o restante do arquivo.
(c) Comparar arquivos de 10 GB provavelmente não reinicializará seu sistema.
(d) Você pode adaptar isso para fazer uma análise mais detalhada das regiões conhecidas do arquivo: dividir e conquistar.
(e) Você pode atribuir seções do intervalo de endereços a várias CPUs.