web-dev-qa-db-fra.com

Comment faire un diff binaire sur deux fichiers de taille identique sous Linux?

J'ai deux fichiers de taille identique et je dois effectuer un diff binaire pour vérifier s'ils sont identiques.

Je suis en train d'exécuter diff file1.img file2.img mais le traitement de mes fichiers de 4 Go prend un certain temps. Est-ce le moyen le plus efficace de le faire?

37
Jon Cage

A trouvé une solution - l'outil cmp fourni avec la plupart des versions de Linux.

16
Jon Cage

cmp est conçu pour rechercher les différences dans les fichiers binaires. Vous pouvez également essayer checksumming (sum) et comparer les hachages.

44
mpez0

L’un des moyens les plus courants de déterminer si deux fichiers sont identiques (en supposant que leur taille corresponde) consiste à utiliser un programme pour créer un hachage " " (essentiellement un empreinte digitale) d'un fichier. Les plus courants sont md5sum et sha1sum .

Par exemple:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Si vous devez vérifier de nombreux fichiers, par exemple si vous transférez un répertoire plein de fichiers d'un système à un autre, vous pouvez rediriger la sortie du système d'origine vers un fichier, puis md5sum/sha1sum peut automatiquement utiliser ce fichier. pour vous dire quels fichiers sont différents:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
20
Adam Batkin

Si je veux simplement savoir s’ils sont identiques, je préfère utiliser sha1sum s’il est disponible, ou md5 comme solution de secours.

Si je veux savoir en quoi elles sont différentes ou différentes, une chose qui fonctionne est de les lancer toutes les deux via od ('octal dump' ', qui a généralement une option hex) pour créer des fichiers temporaires puis les différer.

3
JustJeff

Je viens de lancer quelques tests sur un fichier de plus de 100 Mo. diff était le plus rapide, cmp venait en deuxième position et md5sum arrivait en dernier.

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

J'ai repris l'exercice avec un fichier de 4,3 Go, et j'ai dû supprimer et recréer le fichier avec dd car la mise en cache de RAM affectait grandement les résultats.

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

Sur la base de ces résultats, je recommanderais de déplacer les fichiers vers un montage RAMFS et de coller avec diff.

1
forbidder