Сравнение архивов bzip2 без распаковки: утилита bzcmp

Введение

При администрировании серверов Ubuntu нередко требуется сопоставить содержимое архивных копий или сжатых логов. Традиционное предварительное извлечение файлов на диск отнимает драгоценное время и память. Встроенная утилита bzcmp решает эту проблему, выполняя побайтовую сверку упакованных в формат bzip2 данных прямо на лету. В данном руководстве подробно рассмотрены практические сценарии: анализ возвращаемых кодов завершения, локализация несовпадений и кросс-сравнение архива с обычным текстовым файлом.

Развертывание пакета bzip2 и подготовка тестовых стендов

Для доступа к набору инструментов bzcmp убедимся в наличии пакета bzip2 в системе и выполним его установку при необходимости:

Установка bzip2 через apt-get

Сформируем тестовый набор данных: подготовим пару абсолютно одинаковых текстовых документов и третий файл с измененной строкой:

Создание тестовых файлов через echo

Упакуем созданные документы в формат .bz2. Параметр -k критически важен — он предотвратит удаление исходных текстовых файлов после компрессии:

Сжатие файлов с ключом сохранения оригинала

Сопоставление идентичных архивов и анализ кода возврата ($?)

Проверим идентичность содержимого двух эквивалентных архивов с помощью вызова bzcmp sample1.txt.bz2 sample2.txt.bz2:
В соответствии со стандартным поведением Unix-утилит при полном совпадении данных вывод в терминал отсутствует.

Сравнение двух идентичных архивов bzcmp

Для программного контроля успешности операции в bash-скриптах запросим статус последнего выполненного процесса: echo "Exit Code: $?".
Код возврата 0 однозначно подтверждает эквивалентность информации внутри обоих архивов.

Проверка кода возврата для идентичных файлов

Обнаружение расхождений и детальная побайтовая локализация

Теперь сопоставим архивы с несовпадающими данными: bzcmp sample1.txt.bz2 sample3.txt.bz2.
Утилита моментально зафиксирует разницу и укажет точный номер байта и строку, где обнаружено первое расхождение.

Вывод координат первого несовпадения

Проверим переменную $? после обнаружения несовпадений командой echo "Exit Code: $?":
Ненулевой статус свидетельствует о завершении операции с обнаруженными отличиями в потоках данных.

Проверка статуса завершения при несовпадении данных

Если требуется полная таблица всех несовпадающих байтов, воспользуемся флагом -l: bzcmp -l sample1.txt.bz2 sample3.txt.bz2.
Утилита транслирует поведение cmp -l, последовательно выводя смещение каждого отличного байта в десятичном виде и его значения для обоих источников в восьмеричном формате.

Детальная побайтовая сводка различий с флагом -l

Кросс-сравнение архива с несжатым файлом и очистка стенда

Уникальное преимущество bzcmp заключается в способности сопоставлять запакованный документ напрямую с несжатым оригиналом: bzcmp sample1.txt.bz2 sample1.txt.
Благодаря прозрачной распаковке утилита подтверждает эквивалентность данных без лишнего мусора на накопителе.

Сравнение .bz2 архива с обычным текстом

Смоделируем сценарий расхождения между архивом и несжатым текстовым документом: echo 'Different text' > sample_diff.txt && bzcmp sample1.txt.bz2 sample_diff.txt.
Инструмент корректно перехватывает расхождение и выводит маркеры смещения.

Сравнение архива с отличающимся текстовым файлом

Завершив практические эксперименты, удалим все временные документы и сжатые файлы, восстанавливая исходное состояние каталога:

Очистка тестового окружения командой rm

Инструмент bzcmp из экосистемы Linux позволяет быстро и ресурсоэффективно проверять целостность данных в архивах bzip2. Его интеграция в сценарии мониторинга и резервного копирования исключает лишние операции дискового ввода-вывода при валидации больших объемов сжатой информации.