Comparez des répertoires massifs avec un rapport de progression


13

Je viens de rsynchroniser 2 000 000 de fichiers (3 To) d'un RAID à un autre.

Je veux m'assurer que mes données sont intactes.

rsync -c prend très longtemps.

diff ne me montre pas ce qu'il fait.

Existe-t-il une alternative qui est (a) plus rapide et (b) me montrera les progrès pendant la comparaison?

(Je suis sur Mac et brew search diffme donne apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... est-ce que l'un d'eux ferait le travail?)



Je suis également confus quant à la raison pour laquelle rsyncles données ont été copiées à environ 150 Mo / s, mais ne se diffcomparent qu'à 60 Mo / s ...?
Dan

1
La copie utilisant rsyncest plus rapide b / c rsyncpar défaut n'utilise pas de sommes de contrôle pour comparer les fichiers, il regarde les informations de taille et de date. Lorsque vous utilisez rsync -ctous les fichiers, leur somme de contrôle doit être calculée, ce qui est une tâche fastidieuse, d'où la raison pour laquelle ce n'est pas la valeur par défaut.
slm

Oui, mais diff ne copie pas ... il lit simplement les deux fichiers; tandis que rsync, pour copier, doit lire chaque octet, puis l'écrire. C'était un rsync à partir de zéro, donc il copiait chaque fichier.
Dan

Réponses:


6

modifier pour la correction et la clarté des options - j'ai oublié '--brief'

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

et ajoutez d'autres options au goût, selon ce que vous comparez:

-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 lira chaque octet de l'original et des fichiers de copie et de rapport qui sont identiques.

Le format de sortie diff est défini par POSIX, il est donc assez portable. Vous voudrez peut-être ajouter quelque chose comme:

| tee diff-out.1 | grep -v -Ee 'Les fichiers. * et. * sont identiques'

Vous pouvez utiliser des chksums ou des hachages, mais vous devez ensuite les synchroniser avec les arborescences de fichiers, de sorte que vous devriez de nouveau lire chaque octet de chaque fichier.

EDIT - trop long pour être un commentaire, en réponse à:

les fichiers de plus de 10 Go ne vérifient pas

Vous voudrez peut-être essayer cette option diff: --speed-large-files

Il est possible que le diff que vous utilisez ne gère pas bien les fichiers très volumineux (plus gros que la mémoire système, par exemple), et signale donc des différences entre les fichiers qui sont en fait les mêmes.

J'avais pensé qu'il y avait une option -h ou un 'bdiff' qui faisait mieux sur les gros fichiers, mais je n'en trouve pas dans Fedora. Je crois que les options --speed-large-files sont un successeur à une option de comparaison "-h" ".

Une approche différente serait de répéter la commande rsync que vous avez utilisée, avec '-vin' (verbose, itemize, no_run). Cela signalerait toute différence trouvée par rsync - et il ne devrait pas y en avoir.

Pour déplacer certains fichiers, vous regardez un script quelque chose comme:

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

mais je ne recommande pas de faire ça. La question sous-jacente est "comment puis-je être sûr que rsync a correctement copié une hiérarchie de fichiers?" et si vous pouvez vous démontrer que rsync fonctionne bien, avec diff ou un autre outil, alors vous pouvez simplement compter sur rsync, plutôt que de le contourner.

rsync -vin compare en fonction des autres options que vous lui donnez. Je pensais que la valeur par défaut était la somme de contrôle, mais vous avez raison, -c ou --checksum est requis pour cela.

L'utilitaire diff est vraiment destiné aux fichiers de lignes de texte, mais il devrait signaler des sous-s «identiques» pour les fichiers binaires.

Le --brief devrait supprimer toute sortie de contenu de fichier - mes excuses pour l'avoir ignoré plus tôt - il a été semi-enterré dans un script laid.


Existe-t-il un moyen de le récupérer dans mvchaque fichier qu'il trouve dans un dossier "vérifié" à la racine du lecteur, en préservant le chemin d'accès complet? Par exemple, si /disk1/a/b/c/file1est identique à /disk2/a/b/c/file1, déplacez-le vers /disk1/verified/a/b/c/file1. Ensuite, je pourrais me retrouver avec seulement les fichiers mal copiés. (Jusqu'à présent, BEAUCOUP de fichiers de plus de 10 Go ne vérifient pas, ce qui est effrayant.)
Dan

Vous voudrez peut-être essayer cette option: --speed-large-files
D McKeon

Qu'est-ce que cela fait exactement?
Dan

Si je lance rsync -vin- cela fait-il une comparaison octet par octet ou somme de contrôle? Je pensais que rsync ne comparait que la taille / la date, sauf si vous ajoutez -c. Et d'après ce que j'ai lu, le speed large filessemble ne faire la différence qu'avec les fichiers non binaires ... ou je me trompe?
Dan

diffme donne des résultats sous la forme de "Files __ and ___ differ"... et je suis en cours d'exécution sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"pour essayer de générer un script pour recopier les mauvais fichiers. Mais la sortie de diff n'est pas citée, donc cela ne fonctionne pas. Puis-je l'obtenir pour me donner des chemins cités?
Dan

4

Voici diffun rapport d'étape basé sur le nombre de fichiers:

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

Vous aurez besoin de pv (pipe viewer): http://www.ivarch.com/programs/pv.shtml

Explication:

  • diff -r comparer récursivement les répertoires et sous-répertoires.
  • diff -qimprimer uniquement les noms de fichiers des fichiers diffèrent. n'imprime pas les différences réelles.
  • diff -simprimer également les noms de fichiers qui ne diffèrent pas. ceci est important pour les informations de progression.
  • pv -l signaler les progrès en fonction du nombre de lignes.
  • pv -s count estimer le temps nécessaire pour terminer en fonction du nombre.
  • La redirection vers logfileest pour une jolie sortie. Sinon, la sortie de diffse mélangera avec la ligne d'état de pv.

pour obtenir le nombre de fichiers, utilisez la commande suivante:

find dir1 -type f | wc -l

Filtrez le fichier journal pour les fichiers différents:

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

Cette variation imprimera des fichiers différents en temps réel tout en se connectant à tout logfile:

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

Vous pouvez également enregistrer uniquement les fichiers différents:

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

Remarque: les commandes ci-dessus indiqueront la progression en fonction du nombre de fichiers. Cela fonctionne mieux s'il y a beaucoup de petits fichiers. Si vous avez quelques fichiers énormes, cela ne vous amusera pas beaucoup.

Malheureusement, je ne connais pas de moyen simple de signaler les progrès en fonction des octets comparés.


Si vous pouvez trouver votre tranquillité en comparant simplement les métadonnées (et non le contenu réel des fichiers), vous pouvez utiliser rsync. Ce sera considérablement plus rapide.

Pour plus de détails:


0

J'envisagerais d'utiliser une sorte d'application de hachage pour vérifier l'intégrité des données. Je sais que de nombreux utilitaires de recherche de fichiers en double utilisent des hachages pour identifier les doublons / non-doublons. Il me semble que cette enquête pourrait être utile.


0

Vous pouvez utiliser rdiff-backup pour cela. Installez-le sur les deux serveurs et il fera des comparaisons intelligentes des sommes de contrôle et synchronisera ce qui n'est pas encore là.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.