Відповідь @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. Тепер у файлі gzipped є якийсь заголовок із доданими даними та колонтитулом (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. У всіх інших випадках videff та zcmp використовують лише трубу.
Коли у вас є достатньо новий Bash, для стиснення не буде використовуватися тимчасовий файл, а лише труба. Або, як zdiffкаже джерело:
# Reject Solaris 8's buggy /bin/bash 2.03.