O rsync é a maneira mais rápida e confiável de verificar se os diretórios são idênticos?

5

O problema é: eu copiei uma pasta de 340 GB e queria verificar se a cópia foi bem-sucedida. A cópia foi feita usando rsync -aP /origin /dest de uma partição ext4 para outra partição ext4.

Eu sei que usar diff -r /origin /dest para comparar os diretórios de origem e destino levaria muito (muito) muito tempo. Então eu pensei que eu poderia usar rsync -aP --dry-run /origin /dest para comparar os diretórios ... E levou 5 segundos (!). (Eu usei time antes do comando para medi-lo).

Como rsync -aP mostrou apenas a mensagem "enviando lista de arquivos incrementais" , e nada mais (listaria arquivos ou arquivos diferentes que não foram copiados), concluo que é a mais rápida e a maneira mais confiável de verificar se dois diretórios são idênticos. (Desde que a opção rsync -a tenha sido usada, os arquivos e diretórios também são idênticos em termos de proprietário, permissões e tempo de modificação ... -P implica --progress .)

Estou certo? O rsync -aP --dry-run /origin /dest é a maneira mais rápida e confiável de verificar se os diretórios são idênticos?

    
por yuric 28.07.2016 / 04:06

2 respostas

7

Se você usa diff, ele sempre lê o conteúdo do arquivo para pegar quaisquer diferenças entre o conteúdo.

O Rsync, por padrão, não lerá o conteúdo dos arquivos se o nome do arquivo, a hora da modificação e o tamanho do arquivo entre os dois forem os mesmos. Se estes são os mesmos, assume que o conteúdo do arquivo é o mesmo e não se incomoda de lê-los. Isso tornará as ordens de magnitude mais rápidas em diretórios que já são os mesmos (ou quase o mesmo).

Na maioria dos casos, esse comportamento não é um problema, já que seria muito raro um arquivo ter sido alterado antes e depois da sincronização, ambos dentro da mesma janela de 1 segundo para ter a mesma hora de modificação, e mantém o mesmo tamanho de arquivo. E mesmo que isso acontecesse, seria raro que isso importasse muito.

Você pode forçar o rsync a sempre ler o conteúdo do arquivo, independentemente do tempo de modificação (ou tamanho), usando a opção de linha de comando --ignore-times .

    
por 28.07.2016 / 05:55
3

Velocidade e confiabilidade são freqüentemente requisitos opostos. diff (ou cmp ) compararia os arquivos bit a bit, o que daria a resposta mais confiável . (Use diff -q se você quiser apenas saber se os arquivos são os mesmos.)

Para torná-lo mais rápido, você teria que pular os arquivos na íntegra e contar com os timestamps; ou pule os dados transferidos, o que provavelmente não é um grande problema em um sistema, já que o disco de E / S provavelmente será o fator que limita a velocidade.

Se os arquivos estivessem em sistemas diferentes e você tivesse md5sum ou similar, poderia fazer algo como

cd /somewhere ; find . -type f | xargs -d '\n' md5sum > /tmp/checksums

em ambas as extremidades e, em seguida, compare os arquivos de saída. Dessa forma, você só precisa transferir os hashes, não os dados completos. (ou sha512sum se você quiser um cheque mais strong). rsync -c também aparentemente usa o MD5 internamente .

A escolha entre apenas verificar os registros de data e hora e ler os dados inteiros também depende de qual é a origem de erros presumida. A verificação de metadados informará se o processo de cópia foi encerrado antes de copiar tudo, mas não verificará os dados reais copiados. Para detectar a corrupção de dados silenciosa, os dados absolutamente precisam ser lidos na íntegra e comparar os dados completos ou apenas as somas de verificação. Com o rsync, rsync -i -c produzirá uma lista de arquivos cujas somas de verificação não corresponderam e copie-as novamente.

    
por 28.07.2016 / 13:55