37

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

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

5 ответов5

44

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

20

Одним из наиболее распространенных способов определения идентичности двух файлов (при условии совпадения их размеров) является использование программы для создания « хеша » (по сути, отпечатка пальца) файла. Наиболее распространенными являются 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
16

Нашел решение - инструмент cmp, который поставляется с большинством версий Linux.

3

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

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

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .