ฉันลงไปที่หลุมกระต่ายหลังจากคำตอบอื่นล้มเหลวฉันและจัดการหาเวอร์ชั่น tar ของฉัน (1.27.1 จาก openSUSE 42.3 OSS repo) ใช้pax
รูปแบบเอกสารถาวรที่ไม่ได้กำหนดไว้ซึ่งหมายความว่าแม้ โดยไม่มีการบีบอัด (และแม้แต่การตั้งค่า mtime อย่างชัดเจน) ไฟล์เก็บถาวรที่สร้างด้วย tar จากไฟล์เดียวกันจะแตกต่างกัน:
$ 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
โปรดทราบว่าการส่งออกดังกล่าวข้างต้นจะแตกต่างกันแม้ว่าจะไม่มีการบีบอัดจะถูกใช้ ; เนื้อหาเก็บถาวรที่ไม่บีบอัด (สร้างโดยรัน tar สองครั้งบนเนื้อหาเดียวกัน) แตกต่างกันดังนั้นเนื้อหาที่บีบอัดจะแตกต่างกันแม้ใช้GZIP=-n
เป็นคำตอบอื่น ๆ ที่แนะนำ
เพื่อให้ได้สิ่งนี้คุณสามารถระบุ --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
สิ่งนี้ใช้ได้กับคำแนะนำเกี่ยวกับ gzip ด้านบน:
# 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
แต่นอกเหนือไปจากเหตุผลที่ถูกต้องที่จะชอบรูปแบบการบีบอัดดีกว่าที่จะ gzip , คุณอาจต้องการที่จะต้องพิจารณาใช้ XZ แทน (ซึ่ง tar ยังรองรับด้วย--xz
หรือ-J
ธงแทน-z
) เพราะมันช่วยให้คุณประหยัดขั้นตอนนี่; พฤติกรรมเริ่มต้นของxz
คือการสร้างเอาท์พุทบีบอัดเดียวกันเมื่อเนื้อหาที่ไม่มีการบีบอัดเหมือนกันดังนั้นจึงไม่จำเป็นต้องระบุตัวเลือกเช่น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
การเปลี่ยนแปลงเวลาที่แก้ไขของไฟล์ก็เพียงพอที่จะเปลี่ยน checksum