ฉันจะทำไบนารีต่างกันในไฟล์ที่มีขนาดเหมือนกันสองไฟล์ใน Linux ได้อย่างไร


37

ฉันมีไฟล์ที่มีขนาดเหมือนกันสองไฟล์และฉันจำเป็นต้องใช้เลขฐานสองเพื่อตรวจสอบว่าเป็นไฟล์เดียวกันหรือไม่

ขณะนี้ฉันกำลังรันdiff file1.img file2.imgแต่มันใช้เวลาสักครู่ในการประมวลผลไฟล์ 4 GB ของฉัน นี่เป็นวิธีที่มีประสิทธิภาพที่สุดในการทำสิ่งนี้หรือไม่?

คำตอบ:


45

cmpถูกออกแบบมาเพื่อค้นหาความแตกต่างในไฟล์ไบนารี คุณอาจลองตรวจสอบ ( sum) และเปรียบเทียบแฮช


21

หนึ่งในวิธีที่พบบ่อยที่สุดของการกำหนดว่าแฟ้มที่สองเหมือนกัน (สมมติว่าขนาดของพวกเขาตรง) คือการใช้โปรแกรมที่จะสร้าง " กัญชา " (หลักลายนิ้วมือ) ของไฟล์ คนที่พบบ่อยที่สุดคือmd5sumและsha1sum.

ตัวอย่างเช่น:

$ md5sum file1 file2
e0e7485b678a538c2815132de7f9e878  file1
4a14aace18d472709ccae3910af55955  file2

หากคุณมีไฟล์จำนวนมากที่คุณต้องตรวจสอบเช่นหากคุณถ่ายโอนไดเรกทอรีที่เต็มไปด้วยไฟล์จากระบบหนึ่งไปยังอีกระบบหนึ่งคุณสามารถเปลี่ยนเส้นทางผลลัพธ์จากระบบดั้งเดิมไปยังไฟล์จากนั้นmd5sum/ sha1sumสามารถใช้ไฟล์นั้นโดยอัตโนมัติเพื่อบอก คุณเป็นไฟล์ใด:

$ md5sum file1 file2 > MD5SUMS
... copy file1, file2, MD5SUMS across
$ md5sum --check MD5SUMS
file1: OK
file2: OK

2
MD5 นั้นไม่น่าเชื่อถือเสมอไปสำหรับเรื่องนี้: digg.com/security/…
Jon Cage

28
ที่จริงแล้ว MD5 นั้นเชื่อถือได้สำหรับการตรวจสอบความสมบูรณ์ขั้นพื้นฐาน มันก็ไม่ถือว่าแข็งแกร่ง cryptographically อย่างที่เราเคยคิด ถ้าคุณกังวลเกี่ยวกับแฮ็กเกอร์อย่าใช้ MD5 แต่ถ้าคุณแค่อยากรู้ว่าไฟล์ที่คัดลอกมาจากซีดีเสียหายหรือคอมไพเลอร์ของคุณแตกไฟล์ที่เหมือนกันทุกครั้ง MD5 นั้นก็เพียงพอแล้ว
Adam Batkin


3

ถ้าฉันแค่อยากรู้ว่าพวกเขาเหมือนกันหรือไม่ฉันชอบใช้sha1sumถ้ามันว่างหรือmd5เป็นทางเลือก

หากฉันต้องการทราบว่าแตกต่างกันอย่างไรหรือแตกต่างกันอย่างไรสิ่งหนึ่งที่ใช้ได้คือเหวี่ยงมันทั้งสองผ่านod ('octal dump' ซึ่งมักจะมีตัวเลือก hex) เพื่อสร้างไฟล์ชั่วคราวจากนั้นจึงแตกไฟล์เหล่านั้น


2
หากคุณต้องการทราบว่าพวกเขาเป็นสองไฟล์เหมือนกันหรือไม่ฉันไม่คิดว่าการใช้ sha1sum (หรือ md5sum สำหรับเรื่องนั้น) จะมีประสิทธิภาพมากกว่าการกระจาย (เช่นนี้เป็นคำถามเดิม) เพราะแม้ว่าทั้งสอง ( ไฟล์ขนาดใหญ่) แตกต่างกันตั้งแต่แรก) คุณจะอ่านทั้งสองไฟล์ก่อนที่จะรู้ว่าไฟล์เหล่านั้นแตกต่างกัน
ปิแอร์

@Pierre แต่ hashing และ crypto-sign ทำงานได้บนอุปกรณ์ระยะไกล
VasyaNovikov

1

ฉันเพิ่งรันการวัดประสิทธิภาพบนไฟล์ขนาด 100+ MB diff เร็วที่สุดในขณะที่ cmp มาที่สองและการใช้ md5sum ก็เข้ามาล่าสุด

# time diff file1 file2; echo $?

real    0m0.122s
user    0m0.009s
sys 0m0.113s
0
# time cmp file1 file2; echo $?

real    0m0.213s
user    0m0.097s
sys     0m0.117s
0
# time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m0.279s
user    0m0.211s
sys     0m0.066s

real    0m0.316s
user    0m0.225s
sys     0m0.073s
0

ฉันรันการฝึกใหม่ด้วยไฟล์ 4.3 GB และต้องลบและสร้างไฟล์ใหม่ด้วย dd เนื่องจากการแคช RAM ส่งผลกระทบอย่างมากกับผลลัพธ์

$time diff file1 file2; echo $?

real    0m19.325s
user    0m0.995s
sys 0m5.280s
0

$time cmp file1 file2; echo $?

real    0m36.106s
user    0m4.399s
sys 0m6.147s
0

$time md5sum file1 > /tmp/test; time md5sum file2 > /tmp/test2; diff /tmp/test /tmp/test2; echo $?

real    0m10.441s
user    0m8.054s
sys 0m2.357s

real    0m24.682s
user    0m8.027s
sys 0m3.442s
0

จากผลลัพธ์เหล่านี้ฉันขอแนะนำให้ย้ายไฟล์ไปที่ RAMFS mount และติดกับ diff


ฉันชอบที่คุณทำเกณฑ์มาตรฐานจริง ๆ แต่ 100 Mb ไม่ได้เป็นตัวแทนของกรณีของ OP 1,000Mb จะดีขึ้นมาก
jpaugh

1
ตกลงซึ่งเป็นเหตุผลที่ฉันวิ่งทดสอบ 4.3 กิ๊กไม่กี่เดือนต่อมา ที่จริงแล้วมันใช้ความพยายามในการหลีกเลี่ยงการแคชระบบปฏิบัติการ
forbidder

ฉันคิดว่ามันจะ ฉันขอโทษที่ไม่ได้อ่านการอ่านตรงกลางของคำตอบของคุณ (ฉันยังคิดว่ามันดีพอที่จะถอนรากถอนโคนแม้เพียงแค่เห็นมาตรฐานครั้งแรกเท่านั้น) FWIW มีเคอร์เนลวิเศษสำหรับการปิดใช้งานการแคชไฟล์ ฉันต้องทำเกณฑ์มาตรฐานด้วยตนเองเพื่อดูว่าอันไหนใช้ได้จริงหรือจำเป็น
jpaugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.