Acabei de sincronizar 2.000.000 arquivos (3 TB) de um RAID para outro.
Quero garantir que meus dados estejam intactos.
rsync -c
leva muito tempo.
diff
não me mostra o que está fazendo.
Existe uma alternativa que seja (a) mais rápida e (b) me mostre progresso enquanto estiver 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 deles faria o trabalho?)
rsync
os dados foram copiados em torno de 150MB / s, masdiff
comparam em apenas 60MB / s ...?rsync
é mais rápida b / c,rsync
por padrão, não usa somas de verificação para comparar arquivos, ele analisa informações de tamanho e data. Quando você usarsync -c
todos os arquivos, é necessário calcular as somas de verificação, o que é uma tarefa onerosa, portanto, por que não é o padrão.Respostas:
editar para correção e clareza das opções - esqueci '--brief'
e adicione outras opções a gosto, dependendo do que você está comparando:
O diff -rs lerá todos os bytes do original e copiará e reportará os arquivos iguais.
O formato de saída diff é definido pelo POSIX, por isso é bastante portátil. Você pode adicionar algo como:
| tee diff-out.1 | grep -v -E '' Arquivos. * e. * são idênticos '
Você pode usar chksums ou hashes, mas é necessário mantê-los sincronizados com as árvores de arquivos, para voltar a ler todos os bytes de cada arquivo.
EDIT - muito tempo para ser um comentário, em resposta a:
Você pode tentar esta opção diff: --speed-large-files
É 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, portanto, esteja relatando diferenças entre os arquivos que são realmente iguais.
Eu pensei que havia uma opção -h ou um 'bdiff' que se saía melhor em arquivos grandes, mas não consigo encontrar um no Fedora. Acredito que as opções --speed-large-files são sucessoras de uma opção '-h' "comparação sem entusiasmo".
Uma abordagem diferente seria repetir o comando rsync que você usou, com '-vin' (verbose, itemize, no_run). Isso reportaria quaisquer diferenças encontradas pelo rsync - e não deveria haver nenhuma.
Para mover alguns arquivos, você está vendo um script como:
mas eu não recomendo fazer isso. A questão subjacente é "como posso ter certeza de que o rsync copiou corretamente uma hierarquia de arquivos?" e se você puder demonstrar para si mesmo que o rsync está funcionando bem, com diff ou alguma outra ferramenta, basta confiar no rsync, em vez de contorná-lo.
O rsync -vin será comparado com qualquer outra opção que você escolher. Eu pensei que era padrão a soma de verificação, 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 sub-idênticos 'idênticos' para arquivos binários.
O --brief deve suprimir qualquer saída de conteúdo do arquivo - minhas desculpas por ignorá-lo mais cedo - foi semi-enterrado em um script feio.
fonte
mv
todos os arquivos encontrados em uma pasta "verificada" na raiz da unidade, preservando o caminho completo? Por exemplo, se/disk1/a/b/c/file1
for idêntico a/disk2/a/b/c/file1
, então mova para/disk1/verified/a/b/c/file1
. Então eu poderia acabar apenas com os arquivos mal copiados. (Até agora lotes de arquivos mais de 10 GB não são a verificação, o que é assustador.)rsync -vin
- isso faz uma comparação byte a byte ou soma de verificação? Eu pensei que o rsync apenas comparava tamanho / data, a menos que você adicionasse-c
. E pelo que li,speed large files
parece que só faz diferença com arquivos não binários ... ou estou errado?diff
me dá resultados na forma de"Files __ and ___ differ"
... e estou executando issosed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"
para tentar gerar um script para copiar novamente os arquivos defeituosos. Mas a saída do diff não é citada, portanto não funciona. Posso obtê-lo para fornecer caminhos citados?Aqui está
diff
o relatório de progresso com base na contagem de arquivos:Você precisará de pv (visualizador de tubos): http://www.ivarch.com/programs/pv.shtml
Explicação:
diff -r
compare diretório e subdiretórios recursivamente.diff -q
imprimir apenas nomes de arquivos diferentes. não imprima diferenças reais.diff -s
imprima também nomes de arquivos de arquivos que não diferem. isso é importante para as informações de progresso.pv -l
relatar o progresso com base na contagem de linhas.pv -s count
estimar o tempo para concluir com base na contagem.logfile
é para uma saída bonita. Caso contrário, a saída dediff
será combinada com a linha de status depv
.para obter a contagem de arquivos, use o seguinte comando:
Filtre o arquivo de log para arquivos diferentes:
Essa variação imprimirá arquivos diferentes em tempo real e também fará o logon de tudo
logfile
:Como alternativa, você pode registrar apenas arquivos diferentes:
Nota: os comandos acima relatam o progresso com base na contagem de arquivos. Isso funciona melhor se houver muitos arquivos pequenos. Se você tiver alguns arquivos enormes, não se divertirá muito com isso.
Infelizmente, não conheço uma maneira fácil de relatar o progresso com base nos bytes comparados.
Se você puder encontrar sua paz apenas comparando os metadados (e não o conteúdo real dos arquivos), poderá usar o rsync. Isso será consideravelmente mais rápido.
Para mais detalhes:
fonte
Eu usaria algum tipo de aplicativo hash para verificar a integridade dos dados. Eu sei que muitos utilitários de localização de arquivos duplicados usam hashes para identificar duplicados / não duplicados. Parece-me que esta é uma investigação que pode valer a pena.
fonte
Você pode usar o rdiff-backup para isso. Instale-o nos dois servidores e fará comparações inteligentes de somas de verificação e sincronizará o que ainda não está lá.
fonte