md5sums ที่แตกต่างกันสำหรับเนื้อหา tar เดียวกัน


15

ฉันรันการทดสอบที่สร้างสอง tars จาก dir เดียวกัน (ไฟล์ยังคงไม่เปลี่ยนแปลง) และฉันพบว่า md5sums ของพวกเขาแตกต่างกัน ฉันคิดว่ามีการประทับเวลาบางส่วนที่รวมอยู่ในส่วนหัวของ tar แต่ฉันไม่พบวิธีการแทนที่ ระบบปฏิบัติการของฉันคือ Ubuntu 9.1 ความคิดใด ๆ

ขอบคุณ


แสดงบรรทัดคำสั่ง tar ที่คุณใช้ ไม่ควรมีความแตกต่างนอกจากว่าไฟล์จะถูกแก้ไข แม้touch filenameการเปลี่ยนแปลงเวลาที่แก้ไขของไฟล์ก็เพียงพอที่จะเปลี่ยน checksum
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

นี่คือคำสั่ง: tar czf one.tgz ./bin; tar czf two.tgz ./bin จากนั้น md5s ทั้งสองจะแตกต่างกัน
xain

มันไม่ใช่ tar ตัวเองดูเหมือนว่าจะเป็น gzip หากคุณใช้ j สำหรับ bzip2 แทนมันจะให้ md5sum เดียวกัน อาจเป็นข้อผิดพลาด - ฉันลองบน Cygwin และได้รับเช็คซัมเดียวกัน (ฉันมี Ubuntu 9.10 เช่นกันและได้รับผลลัพธ์ที่แตกต่างกันเช่นเดียวกับคุณ)
หยุดชั่วคราวจนกว่าจะมีประกาศเพิ่มเติม

คำตอบ:


13

เมื่อเดนนิสชี้ให้เห็นข้างต้นก็คือ gzip ส่วนหนึ่งของส่วนหัว gzip เป็นเวลา mod สำหรับสิ่งที่ถูกบีบอัดในไฟล์ หากคุณต้องการ gzip คุณสามารถบีบอัด tarfile ให้เป็นขั้นตอนนอกของ tar แทนที่จะใช้ gzip ภายในของ tar คำสั่ง gzip มีแฟล็กเพื่อไม่ให้บันทึกเวลาการแก้ไขนั้น

tar -c ./bin |gzip -n >one.tgz
tar -c ./bin |gzip -n >two.tgz
md5sum one.tgz two.tgz

สิ่งนี้จะไม่ส่งผลกระทบต่อเวลาภายใน tarfile เพียงอันเดียวในส่วนหัว gzip


4
นอกจากนี้ยังเป็นไปได้ที่จะผ่านตัวเลือก gzip เพื่อ tar เช่นGZIP=-n tar -cz ...
oseiskar

6

ในการสร้างไฟล์ tar ที่มีการตรวจสอบที่สอดคล้องกันให้ทำGZIP=-nดังนี้:

GZIP=-n tar -zcf myOutputTarball.tar /home/luke/directoryIWantToZip

วิธีการทำงาน:น้ำมันดินสามารถยอมรับตัวเลือก gzip โดยใช้GZIPตัวแปรสภาพแวดล้อมชั่วคราวดังกล่าวข้างต้น เช่นเดียวกับ Valter กล่าวว่า tar ใช้ gzip ซึ่งโดยปกติจะใส่การประทับเวลาลงในไฟล์เก็บถาวร ซึ่งหมายความว่าคุณจะได้รับเช็คซัมที่แตกต่างกันเมื่อคุณบีบอัดไฟล์เดียวกัน -nตัวเลือกปิดการใช้งานการประทับเวลาที่


4

ฉันมีปัญหานี้เช่นกันเพื่อให้ gzip ไม่เปลี่ยนเวลาให้ใช้ gzip -n

-n, - ไม่มีชื่อไม่บันทึกหรือเรียกคืนชื่อเดิมและการประทับเวลา

[valter.silva@alog ~]$ gzip --help
Usage: gzip [OPTION]... [FILE]...
Compress or uncompress FILEs (by default, compress FILES in-place).

Mandatory arguments to long options are mandatory for short options too.

  -c, --stdout      write on standard output, keep original files unchanged
  -d, --decompress  decompress
  -f, --force       force overwrite of output file and compress links
  -h, --help        give this help
  -l, --list        list compressed file contents
  -L, --license     display software license
  -n, --no-name     do not save or restore the original name and time stamp
  -N, --name        save or restore the original name and time stamp
  -q, --quiet       suppress all warnings
  -r, --recursive   operate recursively on directories
  -S, --suffix=SUF  use suffix SUF on compressed files
  -t, --test        test compressed file integrity
  -v, --verbose     verbose mode
  -V, --version     display version number
  -1, --fast        compress faster
  -9, --best        compress better
    --rsyncable   Make rsync-friendly archive

With no FILE, or when FILE is -, read standard input.

Report bugs to <bug-gzip@gnu.org>.

ตัวอย่าง:

[valter.silva@alog ~]$ ls
renewClaroMMSCanaisSemanal.log.gz  s3

[valter.silva@alog ~]$ gunzip renew.log.gz 
[valter.silva@alog ~]$ gunzip s3/renew.log.gz 

[valter.silva@alog ~]$ md5sum renew.log 
d41d8cd98f00b204e9800998ecf8427e  renew.log

[valter.silva@alog ~]$ md5sum s3/renew.log 
d41d8cd98f00b204e9800998ecf8427e  s3/renew.log

[valter.silva@alog ~]$ gzip -n renew.log 
[valter.silva@alog ~]$ gzip -n s3/renew.log 

[valter.silva@alog ~]$ md5sum renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  renew.log.gz

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  s3/renew.log.gz

0

ฉันลงไปที่หลุมกระต่ายหลังจากคำตอบอื่นล้มเหลวฉันและจัดการหาเวอร์ชั่น 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.