Tôi đã đi xuống một lỗ thỏ sau khi các câu trả lời khác làm tôi thất bại và tìm ra rằng phiên bản tar của tôi (1.27.1 từ repo openSUSE 42.3 OSS) đang sử dụng định pax
dạng lưu trữ không xác định theo mặc định, điều đó có nghĩa là thậm chí không nén, (và thậm chí thiết lập lưu trữ rõ ràng mtime) được tạo bằng tar từ cùng một tệp sẽ khác nhau:
$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
Lưu ý rằng đầu ra ở trên khác nhau, mặc dù không sử dụng nén ; nội dung lưu trữ không nén (được tạo bằng cách chạy tar hai lần trên cùng một nội dung) là khác nhau, do đó, nội dung nén cũng sẽ khác nhau ngay cả khi sử dụng GZIP=-n
như các câu trả lời khác đề xuất
Để giải quyết vấn đề này, bạn có thể chỉ định --format gnu
:
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
Điều này hoạt động với gợi ý về gzip ở trên:
# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d test.file.tgz
Tuy nhiên, ngoài các lý do hợp lệ để thích các định dạng nén tốt hơn cho gzip , bạn có thể muốn xem xét sử dụng xz thay thế (tar cũng hỗ trợ với các cờ --xz
hoặc -J
thay vì -z
), vì nó giúp bạn tiết kiệm một bước ở đây; hành vi mặc định của xz
là tạo ra cùng một đầu ra được nén khi nội dung không nén giống nhau, do đó không cần chỉ định một tùy chọn như GZIP=-n
:
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
touch filename
việc thay đổi thời gian sửa đổi của tệp cũng đủ để thay đổi tổng kiểm tra.