Відповідь @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.