Câu trả lời của @derobert là tuyệt vời, mặc dù tôi muốn chia sẻ một số thông tin khác mà tôi đã tìm thấy.
gzip -l -v
Các tệp được nén bằng gzip đã chứa một hàm băm (mặc dù không an toàn, hãy xem bài đăng SO này ):
$ 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
Người ta có thể kết hợp CRC và kích thước không nén để có được dấu vân tay nhanh chóng:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Để kiểm tra xem hai byte có bằng nhau hay không, sử dụng cmp file1 file2
. Bây giờ, một tệp được nén có một số tiêu đề với dữ liệu và chân trang (CRC cộng với kích thước gốc) được nối thêm. Các mô tả về các định dạng gzip cho thấy tiêu đề chứa các thời điểm khi các tập tin được nén và rằng tên tập tin là một chuỗi nul-chấm dứt mà được gắn sau header 10 byte.
Vì vậy, giả sử rằng tên tệp là hằng số và cùng một lệnh ( gzip "$name"
) được sử dụng, người ta có thể kiểm tra xem hai tệp có khác nhau hay không bằng cách sử dụng cmp
và bỏ qua các byte đầu tiên bao gồm cả thời gian:
cmp -i 8 file1 file2
Lưu ý : giả định rằng các tùy chọn nén giống nhau rất quan trọng, nếu không lệnh sẽ luôn báo cáo tệp là khác nhau. Điều này xảy ra vì các tùy chọn nén được lưu trữ trong tiêu đề và có thể ảnh hưởng đến dữ liệu nén. cmp
chỉ nhìn vào byte thô và không hiểu nó là gzip.
Nếu bạn có tên tệp có cùng độ dài, thì bạn có thể thử tính toán các byte sẽ bị bỏ qua sau khi đọc tên tệp. Khi tên tệp có kích thước khác nhau, bạn có thể chạy cmp
sau khi bỏ qua byte, như thế cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Đây chắc chắn là cách tốt nhất để thực hiện, đầu tiên nó nén dữ liệu và bắt đầu so sánh các byte với cmp
(thực sự, đây là những gì được thực hiện trong shellscript zcmp
( zdiff
)).
Một lưu ý, đừng sợ ghi chú sau trong trang hướng dẫn:
Khi cả hai tệp phải được giải nén trước khi so sánh, tệp thứ hai không được nén thành / tmp. Trong tất cả các trường hợp khác, zdiff và zcmp chỉ sử dụng một đường ống.
Khi bạn có Bash mới, nén sẽ không sử dụng tệp tạm thời, chỉ là một đường ống. Hoặc, như zdiff
nguồn tin nói:
# Reject Solaris 8's buggy /bin/bash 2.03.