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

37

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

Je suis actuellement en cours d'exécution, diff file1.img file2.imgmais cela prend un certain temps pour traiter mes fichiers de 4 Go. Est-ce le moyen le plus efficace de le faire?

Jon Cage
la source

Réponses:

45

cmpest conçu pour trouver des différences dans les fichiers binaires. Vous pouvez également essayer checksumming ( sum) et comparer les hachages.

mpez0
la source
21

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 une empreinte digitale) d’un fichier. Les plus communs sont md5sumet sha1sum.

Par exemple:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Si vous devez vérifier plusieurs 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/ sha1sumpeut utiliser automatiquement ce fichier pour indiquer vous quels fichiers sont différents:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Adam Batkin
la source
2
MD5 n'est pas toujours fiable pour cela: digg.com/security/…
Jon Cage
28
En réalité, MD5 est fiable pour les contrôles d’intégrité de base. Ce n'est tout simplement pas considéré comme aussi fort cryptographiquement que nous le pensions. Si vous êtes inquiet au sujet des pirates informatiques, n'utilisez pas MD5, mais si vous voulez simplement savoir si certains fichiers copiés à partir d'un CD sont corrompus, ou si votre compilateur recrache des fichiers identiques à chaque fois, MD5 est plus que suffisant.
Adam Batkin
16

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

Jon Cage
la source
3

Si je veux juste 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 hexadécimale) pour créer des fichiers temporaires, puis les différencier.

JustJeff
la source
2
Si vous voulez savoir s’il s’agit de deux fichiers identiques, je ne pense pas que l’utilisation de sha1sum (ou md5sum en l'occurrence) puisse être plus efficace que simplement diff (comme c'était la question initiale), car même si les deux ( gros) diffèrent au tout début), vous les lirez entièrement avant de savoir qu’elles diffèrent.
Pierre
@Pierre BUT, le hachage et la crypto-signature fonctionnent sur des périphériques distants.
VasyaNovikov
1

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 recommencé 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 la 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.

défenseur
la source
J'aime le fait que vous ayez fait un point de repère, mais 100 Mo n'est pas représentatif du cas du PO. 1000Mo serait beaucoup mieux.
Jpaugh
1
d’accord, c’est pourquoi j’ai exécuté les tests de 4,3 Go quelques mois plus tard. En réalité, il a fallu déployer des efforts pour contourner la mise en cache du système d'exploitation.
interdit le
J'imagine que c'est le cas. Je m'excuse de ne pas avoir lu la lecture au milieu de votre réponse. (Je pensais toujours que c'était assez bon pour passer au vote, même si on ne voyait que le premier point de repère.) FWIW, la magie du noyau permet de désactiver la mise en cache des fichiers. Il faudrait que je vérifie moi-même quels sont ceux qui fonctionnent ou sont nécessaires.
Jpaugh