Ответ @derobert великолепен, хотя я хочу поделиться другой информацией, которую нашел.
gzip -l -v
Сжатые gzip файлы уже содержат хеш (хотя и небезопасно, см. этот пост ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
Можно комбинировать CRC и несжатый размер, чтобы быстро получить отпечатки пальцев:
gzip -v -l foo.gz | awk '{print $2, $7}'
CMP
Для проверки, равны ли два байта, используйте cmp file1 file2
. Теперь в сжатом файле есть заголовок с добавлением данных и нижнего колонтитула (CRC плюс исходный размер). Описание формата GZIP показывает , что заголовок содержит время , когда файл был сжат и что имя файла является NUL-завершённой строкой , которая добавляется после заголовка 10 байт.
Итак, предполагая, что имя файла является постоянным и gzip "$name"
используется одна и та же команда ( ), можно проверить, отличаются ли два файла, используя cmp
и пропуская первые байты, включая время:
cmp -i 8 file1 file2
Примечание : предполагается, что важны одинаковые параметры сжатия, в противном случае команда всегда будет сообщать о файле как о другом. Это происходит потому, что параметры сжатия хранятся в заголовке и могут влиять на сжатые данные. cmp
просто смотрит на необработанные байты и не интерпретирует их как gzip.
Если у вас есть имена файлов одинаковой длины, вы можете попытаться вычислить байты, которые будут пропущены после прочтения имени файла. Когда имена файлов имеют разный размер, вы можете запустить cmp
после пропуска байтов, например cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Это определенно лучший способ, сначала он сжимает данные и начинает сравнивать байты с cmp
(на самом деле, это то, что делается в zcmp
( zdiff
) оболочке).
Одно замечание, не бойтесь следующего примечания на странице руководства:
Когда оба файла должны быть распакованы перед сравнением, второй распаковывается в / tmp. Во всех остальных случаях zdiff и zcmp используют только трубу.
Когда у вас достаточно новый Bash, сжатие не будет использовать временный файл, а только канал. Или, как zdiff
говорит источник:
# Reject Solaris 8's buggy /bin/bash 2.03.