266 votes

Comment comparer des fichiers binaires pour vérifier s'ils sont identiques ?

Quel est le moyen le plus simple (en utilisant un outil graphique ou une ligne de commande sur Ubuntu Linux) de savoir si deux fichiers binaires sont identiques ou non (à l'exception des horodatages) ? Je n'ai pas besoin d'extraire la différence. J'ai juste besoin de savoir s'ils sont identiques ou non.

19voto

Rikki Points 350

Vous pouvez utiliser la fonction de hachage MD5 pour vérifier si deux fichiers sont identiques. Avec cette fonction, vous ne pouvez pas voir les différences à un bas niveau, mais c'est un moyen rapide de comparer deux fichiers.

md5 <filename1>
md5 <filename2>

Si les deux hachages MD5 (la sortie de la commande) sont identiques, alors les deux fichiers ne sont pas différents.

9voto

StackzOfZtuff Points 1109

Essayez diff -s

Réponse courte : courir diff con el -s interrupteur.

Longue réponse : lisez ce qui suit.


Voici un exemple. Commençons par créer deux fichiers dont le contenu binaire est aléatoire :

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

Maintenant, faisons une copie du premier fichier :

$ cp test1.bin copyoftest1.bin

Maintenant test1.bin et test2.bin devraient être différents :

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

... et test1.bin et copyoftest1.bin devraient être identiques :

$ diff test1.bin copyoftest1.bin

Mais attendez ! Pourquoi n'y a-t-il pas de sortie ? !?

La réponse est la suivante : c'est un choix délibéré. Il n'y a pas de sortie sur des fichiers identiques.

Mais il y a différents codes d'erreur :

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1

$ diff test1.bin copyoftest1.bin

$ echo $?
0

Heureusement, vous n'avez pas besoin de vérifier les codes d'erreur à chaque fois, car vous pouvez simplement utiliser l'outil d'aide à la décision. -s (ou --report-identical-files ) interrupteur pour que diff soit plus verbeux :

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical

6voto

DKroot Points 40

Avec les options suivantes, Diff effectue une comparaison binaire pour vérifier si les fichiers sont différents ou s'ils sont identiques :

diff -qs {file1} {file2}

Si vous comparez deux fichiers portant le même nom et se trouvant dans des répertoires différents, vous pouvez utiliser ce formulaire à la place :

diff -qs {file1} --to-file={dir2}

OS X El Capitan

6voto

user2008151314 Points 612

Utilisez la commande cmp. Se référer à Fichiers binaires et comparaison forcée de textes pour plus d'informations.

cmp -b file1 file2

4voto

Daniel Alder Points 425

Pour trouver les défauts de la mémoire flash, j'ai dû écrire ce script qui montre tous les blocs de 1K qui contiennent des différences (pas seulement le premier comme cmp -b ne)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

Sortie :

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

Disclaimer : J'ai piraté le script en 5 min. Il ne supporte pas les arguments de ligne de commande ni les espaces dans les noms de fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X