Jawaban @derobert luar biasa, walaupun saya ingin membagikan beberapa informasi lain yang saya temukan.
gzip -l -v
File yang dikompresi gzip sudah mengandung hash (meskipun tidak aman, lihat posting SO ini ):
$ 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
Satu dapat menggabungkan CRC dan ukuran terkompresi untuk mendapatkan sidik jari cepat:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Untuk memeriksa apakah dua byte sama atau tidak, gunakan cmp file1 file2
. Sekarang, file gzipped memiliki beberapa header dengan data dan footer (CRC plus ukuran asli) ditambahkan. The deskripsi gzip format yang menunjukkan bahwa header berisi waktu ketika file tersebut dikompres dan bahwa nama file adalah string nul-dihentikan yang ditambahkan setelah header 10-byte.
Jadi, dengan asumsi bahwa nama file konstan dan perintah yang sama ( gzip "$name"
) digunakan, orang dapat memeriksa apakah dua file berbeda dengan menggunakan cmp
dan melewatkan byte pertama termasuk waktu:
cmp -i 8 file1 file2
Catatan : asumsi bahwa opsi kompresi yang sama adalah penting, jika tidak maka perintah akan selalu melaporkan file yang berbeda. Ini terjadi karena opsi kompresi disimpan di header dan dapat memengaruhi data yang dikompresi. cmp
hanya melihat byte mentah dan tidak menafsirkannya sebagai gzip.
Jika Anda memiliki nama file dengan panjang yang sama, maka Anda dapat mencoba menghitung byte yang akan dilewati setelah membaca nama file. Ketika nama file berukuran berbeda, Anda bisa menjalankan cmp
setelah melewatkan byte, seperti cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Ini jelas merupakan cara terbaik, pertama-tama memampatkan data dan mulai membandingkan byte dengan cmp
(sungguh, inilah yang dilakukan di dalam zcmp
( zdiff
) shellscript).
Satu catatan, jangan takut dengan catatan berikut di halaman manual:
Ketika kedua file harus terkompresi sebelum perbandingan, yang kedua tidak dikompresi ke / tmp. Dalam semua kasus lain, zdiff dan zcmp hanya menggunakan pipa.
Ketika Anda memiliki Bash yang cukup baru, kompresi tidak akan menggunakan file sementara, hanya sebuah pipa. Atau, seperti zdiff
kata sumber itu:
# Reject Solaris 8's buggy /bin/bash 2.03.