Як зробити двійкову різницю для двох файлів однакового розміру під Linux?


37

У мене два файли однакового розміру, і мені потрібно зробити двійкову різницю, щоб перевірити, чи однакові вони.

Наразі я запущений, diff file1.img file2.imgале обробка моїх 4 ГБ файлів потребує досить тривалого часу. Це найефективніший спосіб зробити це?

Відповіді:


45

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


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 ('восьмеричний дамп', який, як правило, має шістнадцятковий варіант), створювати тимчасові файли, а потім відрізняти їх.


2
Якщо ви хочете знати, чи є два файли однаковими, я не думаю, що використання sha1sum (або md5sum з цього приводу) може бути більш ефективним, ніж просто diff (так як це було початкове питання), тому що навіть якщо два ( великі) файли відрізняються на самому початку), ви повністю прочитаєте їх, перш ніж знати, що вони відрізняються.
П’єр

@Pierre АЛЕ хешування та підписання криптовалют працює на віддалених пристроях.
VasyaNovikov

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 і дотримуватися розл.


Мені подобається, що ви насправді зробили орієнтир, але 100 Мб не є представником справи ОП. 1000Mb було б набагато краще.
jpaugh

1
погодився, тому я пройшов тести на 4,3 концерту через кілька місяців. Насправді знадобилися зусилля, щоб обійти кешування ОС.
заборонець

Я думаю, це так і є. Прошу вибачення за те, що не прочитав прочитання середини вашої відповіді. (Я все ще вважав, що це досить добре, аби побачити лише перший показник.) FWIW, є якась магія ядра для відключення кешування файлів. Я повинен був би сам зробити еталон, щоб побачити, які з них насправді працюють чи потрібні.
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.