Как сделать бинарный diff для двух файлов одинакового размера в Linux?

37

У меня есть два файла одинакового размера, и мне нужно выполнить двоичный анализ, чтобы проверить, совпадают ли они.

В настоящее время я работаю, diff file1.img file2.imgно на обработку файлов объемом 4 ГБ уходит довольно много времени. Это самый эффективный способ сделать это?

Джон Кейдж
источник

Ответы:

45

cmpпредназначен для поиска различий в двоичных файлах. Вы также можете попробовать контрольную сумму ( sum) и сравнить хэши.

mpez0
источник
21

Одним из наиболее распространенных способов определения идентичности двух файлов (при условии совпадения их размеров) является использование программы для создания « хеша » (по сути, отпечатка пальца) файла. Наиболее распространенными являются md5sumи sha1sum.

Например:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

Если у вас есть много файлов, которые необходимо проверить, например, если вы переносите каталог, полный файлов, из одной системы в другую, вы можете перенаправить вывод из исходной системы в файл, а затем md5sum/ sha1sumможет автоматически использовать этот файл, чтобы сообщить вы какие файлы разные

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK
Адам Баткин
источник
2
MD5 не всегда надежен для этого: digg.com/security/…
Джон Кейдж,
28
На самом деле, MD5 является надежным для базовых проверок целостности. Это просто не считается настолько криптографически сильным, как мы когда-то думали. Если вы беспокоитесь о хакерах, не используйте MD5, но если вы просто хотите узнать, не повреждены ли некоторые файлы, скопированные с компакт-диска, или ваш компилятор каждый раз выдает идентичные файлы, MD5 более чем достаточно.
Адам Баткин
3

Если я просто хочу узнать, одинаковы ли они, я предпочитаю использовать sha1sum, если он доступен, или md5 в качестве запасного варианта.

Если я хочу узнать, насколько они различны или где они различаются, то единственное, что работает, - это запустить их через od («восьмеричный дамп», который обычно имеет шестнадцатеричную опцию), чтобы создать временные файлы, а затем разнести их.

JustJeff
источник
2
Если вы хотите узнать, являются ли они двумя файлами одинаковыми, я не думаю, что использование sha1sum (или md5sum в этом отношении) может быть более эффективным, чем просто diff (как это было в первоначальном вопросе), потому что даже если два ( большие) файлы отличаются в самом начале), вы полностью прочитаете их, прежде чем узнаете, что они различаются.
Пьер
@Pierre НО, хеширование и криптографическая подпись работают на удаленных устройствах.
ВасяНовиков
1

Я только что провел несколько тестов для файла размером более 100 МБ. diff был самым быстрым, в то время как cmp был вторым, а использование md5sum - последним.

# 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

Я перезапустил упражнение с файлом 4,3 ГБ, и мне пришлось удалить и заново создать файл с помощью dd, поскольку кэширование в ОЗУ сильно влияло на результаты.

$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

Основываясь на этих результатах, я бы порекомендовал переместить файлы в монтирование RAMFS и придерживаться diff.

forbidder
источник
Мне нравится, что вы на самом деле сделали эталонный тест, но 100 Мб не являются репрезентативными для ОП. 1000Mb будет намного лучше.
jpaugh
1
согласился, поэтому я провел тесты на 4,3 концерта несколько месяцев спустя. На самом деле потребовалось усилие, чтобы обойти кеширование ОС.
запретитель
Я предполагаю, что это делает. Я прошу прощения за то, что не читал, читая середину вашего ответа. (Я все еще думал, что это достаточно хорошо, чтобы поднять голос, даже если посмотреть только на первый тест.) FWIW, есть некоторая магия ядра для отключения кэширования файлов. Я должен был сделать тест самостоятельно, чтобы увидеть, какие из них на самом деле работают или необходимы.
jpaugh