Comparar diretórios massivos com relatório de progresso

10

Acabei de rsyncar 2.000.000 de arquivos (3TB) de um RAID para outro.

Eu quero ter certeza de que meus dados estão intactos.

rsync -c demora muito tempo.

diff não me mostra o que está fazendo.

Existe uma alternativa que é (a) mais rápida e (b) me mostrará progresso enquanto está comparando?

(Estou no Mac e brew search diff me dá apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... um desses faria o trabalho?)

    
por Ze'ev 28.01.2014 / 05:38

4 respostas

5

edite para correção & opção clareza - eu esqueci '- breve'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

e adicione outras opções para testar, dependendo do que você está comparando:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs irá ler cada byte do original e copiar, e relatar arquivos que são os mesmos.

O formato de saída do diff é definido por POSIX, então é bonito portátil. Você pode querer adicionar algo como:

| tee diff-out.1 | grep -v -Ee 'Files. * e. * são idênticos'

Você pode usar chksums ou hashes, mas você precisa mantê-los sincronizado com as árvores de arquivos, então você voltaria a ler cada byte de todos os arquivos de qualquer maneira.

EDIT - muito longo para ser um comentário, em resposta a:

files over 10GB are not verifying

Você pode querer experimentar esta opção de diferenças: --speed-files grandes

É possível que o diff que você está usando não esteja lidando bem com arquivos muito grandes (maiores que a memória do sistema, por exemplo) e relatando assim as diferenças entre os arquivos que são realmente os mesmos.

Eu achava que havia uma opção -h ou um 'bdiff' que funcionava melhor arquivos grandes, mas não consigo encontrar um no Fedora. Eu acredito que o opções --speed-large-files é um sucessor para um '-h' "half-hearted compare "opção.

Uma abordagem diferente seria repetir o comando rsync que você usou, com '-vin' (verbose, itemize, no_run). Isso informaria qualquer diferenças que o rsync encontra - e não deve haver nenhuma.

Para mover alguns arquivos, você está olhando para um script como:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

mas não recomendo fazer isso. A questão subjacente é "como posso ter certeza de que o rsync copiou uma hierarquia de arquivos corretamente? " e se você puder demonstrar para si mesmo que o rsync está funcionando bem, com diff ou alguma outra ferramenta, então você pode confiar no rsync, em vez de trabalhar em torno dele.

rsync -vin irá comparar com base em quaisquer outras opções que você der. Eu pensei que o padrão era checksum, mas você está certo, -c ou --checksum é necessário para isso.

O utilitário diff é realmente destinado a arquivos de linhas de texto, mas deve reportar 'idêntico' sob -s para arquivos binários.

O --brief deve suprimir qualquer saída de conteúdo de arquivo - minhas desculpas por ter negligenciado isso antes - foi semi-enterrado em um roteiro feio.

    
por 28.01.2014 / 06:38
2

Aqui está diff com o relatório de progresso:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Você precisará do pv (visualizador de canais): link

Explicação:

  • diff -r compara o diretório e os subdiretórios de forma recursiva.
  • diff -q imprimir apenas nomes de arquivo de arquivos diferentes. não imprima as diferenças reais.
  • diff -s imprime também nomes de arquivos que não são diferentes. isso é importante para as informações de progresso.
  • pv -l reporta o progresso com base na contagem de linhas.
  • pv -s count tempo estimado para concluir com base na contagem.
  • O redirecionamento para logfile é uma boa saída. Caso contrário, a saída de diff será combinada com a linha de status de pv .

para obter a contagem de arquivos, use o seguinte comando:

find dir1 -type f | wc -l

Filtre o arquivo de log para arquivos diferentes:

grep -v "^Files .* identical$" logfile

Essa variação imprimirá arquivos diferentes em tempo real, além de registrar tudo em logfile :

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Como alternativa, você pode registrar somente arquivos diferentes:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Nota: os comandos acima reportarão o progresso com base na contagem de arquivos. Isso funciona melhor se houver muitos arquivos pequenos. Se você tem alguns arquivos enormes, então você não vai se divertir muito com isso.

Infelizmente, não conheço uma maneira de relatar o progresso com base em bytes comparados.

Se você puder encontrar a sua paz apenas comparando os metadados (e não o conteúdo real dos arquivos), então você pode usar o rsync. Isso será consideravelmente mais rápido.

Para mais detalhes:

por 11.12.2016 / 14:07
0

Eu procuraria usar algum tipo de aplicativo de hash para verificar a integridade dos dados. Eu sei que muitos utilitários de busca de arquivos duplicados usam hashes para identificar duplicados / não-duplicados. Parece-me que esta é uma investigação que pode valer a pena.

    
por 28.01.2014 / 05:48
0

Você pode usar o rdiff-backup para isso. Instale nos dois servidores e faça comparações inteligentes de checksums e sincronize o que ainda não está lá.

    
por 28.01.2014 / 09:11