Вопрос или проблема
У меня есть два файла размером несколько гигабайт, которые были сжаты с помощью xz
. Я подозреваю, что исходные файлы перед сжатием идентичны, но они были сжаты с различными параметрами xz
, поэтому сжатые файлы различаются.
Как я могу проверить, что файлы идентичны, не распаковывая их? Поскольку они такие большие, я бы предпочел не распаковывать их, если это не обязательно.
Я знаю, что xz
хранит контрольную сумму CRC, поэтому подумал, что это должно быть достаточно просто: просто напечатать и сравнить контрольные суммы CRC каждого файла. Однако команда xz -l
(и xz -l -v
) просто перечисляет контрольную сумму как тип “CRC64” вместо того, что на самом деле является контрольной суммой.
Вы беспокоитесь о времени/производительности декомпрессии или о хранении распакованных файлов?
Вы можете избежать хранения файлов, используя
xzcat file1 | sha256sum
xzcat file2 | sha256sum
и сравнивая результаты.
Кроме того, при достаточной детализации (xz -vvl file1
) вы получите значение CRC64. Поскольку xz
позволяет использовать различные алгоритмы контрольных сумм, возможно, ваши архивы были созданы с использованием различных алгоритмов, в этом случае это не поможет.
Если вас беспокоит время декомпрессии, я предположу, что ожидание ответа на StackExchange занимает немного больше времени…
xz -lvv
покажет контрольную сумму содержимого в столбце CheckVal
.
> echo foo > test
> xz --fast -kf test
> md5sum test.xz
73f4e719ee8a19d7afa90939e6340e0c test.xz
> xz -lvv test.xz
test.xz (1/1)
...
Blocks:
Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check CheckVal Header Flags CompSize MemUsage Filters
1 1 12 0 32 4 8.000 CRC64 f29c31305aacd7ff 16 cu 8 1 MiB --lzma2=dict=256KiB
...
> xz --best -kf test
> md5sum test.xz
fc821047713f85563b66cd1dc64b611b test.xz
> xz -lvv test.xz
test.xz (1/1)
...
Blocks:
Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check CheckVal Header Flags CompSize MemUsage Filters
1 1 12 0 36 4 9.000 CRC64 f29c31305aacd7ff 20 cu 8 65 MiB --lzma2=dict=64MiB
...
Ответ или решение
Чтобы проверить идентичность двух файлов, сжатых с помощью xz, без необходимости их разжатия, наиболее подходящим методом является использование контрольных сумм CRC, которые xz хранит в заголовке каждого сжатого файла. Однако команда xz -l
отображает только тип контрольной суммы (CRC64), а не саму сумму. В этом ответе подробно расскажем о том, как получить контрольные суммы и корректно их сравнить.
1. Использование команды xz -lvv
Чтобы получить контрольные суммы, выполните команду xz -lvv <имя_файла>.xz
. Эта команда выводит подробную информацию о сжатом файле, включая значение контрольной суммы. Например:
xz -lvv file1.xz
В результате выполнения вы увидите таблицу, содержащую столбцы с информацией о блоках, размере и значения контрольной суммы в столбце CheckVal
. Если контрольные суммы обоих файлов совпадают, это будет свидетельствовать о том, что исходные файлы действительно идентичны.
2. Использование xzcat
и сравнение SHA256
Если вам необходимо более надежное средство проверки, помимо контрольных сумм CRC, можно рассмотреть использование команды xzcat
. Этот метод позволяет генерировать и сравнивать контрольные суммы для разжатых данных, не занимая дополнительного места на диске:
xzcat file1.xz | sha256sum
xzcat file2.xz | sha256sum
Сравните выводы обеих команд. Если суммы совпадают, файлы идентичны. Этот метод хорош, если вы хотите минимизировать использование дискового пространства и избегать длительных процессов разжатия.
3. Учитывайте различные алгоритмы контрольных сумм
Важно отметить, что xz может использовать различные алгоритмы для вычисления контрольных сумм, и если файлы были созданы с разными параметрами xz, это может привести к несовпадению контрольных сумм. Если такие ситуации возможны, рекомендуется удостовериться, что оба файла были созданы с использованием одного и того же алгоритма.
4. Заключение
Таким образом, для проверки идентичности двух сжатых файлов xz без их разжатия можно использовать команду xz -lvv
для извлечения контрольных сумм CRC64 или xzcat
с последующим вычислением хешей с использованием SHA256. Выбор метода зависит от ваших требований к точности и удобству процесса. Пользуйтесь предложенными методами, чтобы эффективно проверять идентичность больших файлов и оптимизировать ваши рабочие процессы в IT.