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?
A trouvé une solution - l'outil cmp fourni avec la plupart des versions de Linux.
cmp
est conçu pour rechercher les différences dans les fichiers binaires. Vous pouvez également essayer checksumming (sum
) et comparer les hachages.
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
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.
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.