คำนวณ MD5 checksum ของไดเรกทอรี


29

ฉันกำลังมองหาวิธีที่รวดเร็วในการเปรียบเทียบเนื้อหาของไดเรกทอรี เป็นไปได้ไหมที่จะทำ md5sum (หรือ checksum ที่เทียบเท่า) ของไดเรกทอรีทั้งหมด?

ใช้ Ubuntu Linux


คุณอาจต้องการใช้ diff เพื่อเปรียบเทียบไดเรกทอรีซึ่งจะแสดงให้คุณเห็นว่าไดเรกทอรีแตกต่างกันอย่างไร unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee

@Kibbee เพื่อป้องกันไม่ให้คุณต้องคำนึงถึงสิ่งอื่นนอกเหนือจากเนื้อหาข้อมูลของแต่ละไฟล์และวิธีที่คุณตรวจสอบไฟล์ ให้ไว้: [checksums] 1. A (ไดเรกทอรี) - File1 [ABC] - File2 [CBA] 2. B (Directory) - File1 [ABC] - B1 (Directory) - File2 [CBA] 3. C (Directory) - File4 [ABC] - File5 [CBA] 4. D (ไดเรกทอรี) - สำเนา File1 [ABC] - สำเนา File2 [CBA] ไดเรกทอรีAและBไม่เหมือนกันแม้ว่าจะมีไฟล์เดียวกัน (แม้ว่าในB1 , File2อยู่ในไดเรกทอรีย่อย) . ภายใต้ตัวอย่างของคุณAและCจะถือว่าเหมือนกันเพราะ
Jacob Lyles

คำตอบ:


36

แน่นอน - md5sum directory/*

หากคุณต้องการบางสิ่งที่ยืดหยุ่นกว่าเล็กน้อย (เช่นสำหรับการเปรียบเทียบไดเรกทอรีซ้ำหรือแฮช) ให้ลอง md5deep

apt-get install md5deep
md5deep -r directory

ในการเปรียบเทียบโครงสร้างไดเรกทอรีคุณสามารถให้รายการแฮชเพื่อเปรียบเทียบกับ:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

นี่จะแสดงผลไฟล์ทั้งหมดใน directory2 ที่ไม่ตรงกับ directory1

สิ่งนี้จะไม่แสดงไฟล์ที่ถูกลบออกจาก directory1 หรือไฟล์ที่ถูกเพิ่มไปยัง directory2


ไม่ใช่สิ่งที่ฉันต้องการ แต่สิ่งที่ฉันต้องการ :) ฉันหมายถึงการเรียกซ้ำแล้วซ้ำอีกและได้รับหนึ่งแฮชในตอนท้าย แต่ฉันคิดว่านี่สามารถทำได้ด้วย md5deep -l และเอาท์พุท hashing
ปลาปักเป้า

1
ลำดับของการแฮชไม่สอดคล้องกันดังนั้นจะต้องเรียงลำดับผลลัพธ์ก่อนการแฮช
ปลาปักเป้า

1
เพื่อให้ได้คำสั่งที่กำหนดใช้-j0ที่ปิดการใช้งานมัลติเธรด (ดูหน้าคน)
Johann

1
@ ShaneMadden ♦ฉันติดตั้งmd5deepพร้อมกับsudo apt-get install md5deepเมื่อUbuntu 16.04แต่เมื่อฉันพยายามที่จะอ่านหน้าคนมันบอกฉันว่า> ไม่มีรายการคู่มือสำหรับ md5deep
Kasun Siyambalapitiya

27

หากคุณต้องการดูว่ามีอะไรแตกต่างกัน (ถ้ามี) ระหว่างสองไดเรกทอรี rsync น่าจะเหมาะสม

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

รายการนี้จะแสดงรายการไฟล์ที่แตกต่าง


2
diff -qr /source/directory/ /destination/directory/จะแสดงไฟล์ที่แตกต่างกัน
Konerak

มีวิธีการเปรียบเทียบ bitwise แทน checksums หรือไม่ มันอาจเร็วกว่าสำหรับไดรฟ์ในเครื่อง
อาลี

ดีมาก. ใช้งานได้หากแหล่งที่มาหรือปลายทางนั้นเป็นโฟลเดอร์ระยะไกลเช่นusername@hostname:/destination/directory
Thalis K.

11

ฉันคิดว่าฉันตอบก่อนหน้านี้ด้วยคำตอบนี้:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

ให้: b1a5b654afee985d5daccd42d41e19b2877d66b1

แนวคิดก็คือคุณแฮชไฟล์ทั้งหมดที่ตัดแฮชออกหนึ่งรายการต่อบรรทัดเรียงลำดับและแฮชที่ให้แฮชเดียว สิ่งนี้ไม่ได้ขึ้นอยู่กับชื่อของไฟล์


5

cfvแอปพลิเคประโยชน์มากไม่เพียง แต่จะสามารถตรวจสอบและสร้าง checksums MD5 ก็ยังสามารถทำ CRC32, sha1, ฝนตกหนักที่ตราไว้หุ้น PAR2

เพื่อสร้างไฟล์ตรวจสอบ CRC32 สำหรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน:

cfv -C

เพื่อสร้างไฟล์ MD5 checksum สำหรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน:

cfv -C -t md5 -f "ไดเรกทอรีปัจจุบัน. md5sums"

ในการสร้างไฟล์เช็คซัมแยกต่างหากสำหรับแต่ละไดเรกทอรีย่อย:

cfv -C -r

ในการสร้างไฟล์ตรวจสอบ "super" ที่มีไฟล์ในไดเรกทอรีย่อยทั้งหมด:

cfv -C -rr

4

ฉันใช้ hashdeep ตามที่อธิบายไว้ในคำตอบ askubuntu นี้: ตรวจสอบความถูกต้องของไฟล์ที่คัดลอก :

ในการคำนวณผลรวมตรวจสอบ:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

ในการตรวจสอบและแสดงความแตกต่าง:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

สิ่งนี้มีข้อได้เปรียบมากกว่า md5deep ซึ่งจะแสดงการเปลี่ยนชื่อ (ย้าย) เพิ่มและลบไฟล์รวมถึงการหลีกเลี่ยงปัญหาไฟล์ 0 ความยาวที่ชี้ไปที่ด้านล่างของhttp://www.meridiandiscovery.com/how- ไป


3

สิ่งนี้ใช้ได้กับฉัน: (เรียกใช้ขณะที่อยู่ในไดเรกทอรีที่คุณสนใจ)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum

1

คุณสามารถสร้างผลรวม MD5 ของทุกไฟล์เดียวสั่งซื้อ checksums เหล่านี้ตามลำดับตัวอักษรและมีพวกเขา (มีหรือไม่มีบรรทัดใหม่) เนื่องจาก MD5 เป็นรหัสลับจึงควรใช้งานได้ดีกับแฮชของแฮช

ควรมีลำดับที่แน่นอนสำหรับสิ่งต่าง ๆ มิฉะนั้นคุณจะได้ผลลัพธ์ที่แตกต่างกันสำหรับผู้เรียนที่เท่ากัน

และคุณควรพิจารณาว่าการเพิ่มไฟล์บางส่วนให้เป็นหนึ่งใน dir สมบูรณ์จะเปลี่ยนผลถึงแม้ว่ามันจะเป็นเพียง.directoryของ.DS_Storeไฟล์


เทคนิคหนึ่งอาจได้รับแฮชเดียวกันสำหรับไดเรกทอรีที่แตกต่างกัน หาก dir A มี 2 ไฟล์ที่มีเนื้อหา 'ab' และ 'c' และ dir B มี 2 ไฟล์ที่มีเนื้อหา 'a' และ 'bc' จากนั้นการแฮชเฉพาะข้อมูลในไฟล์จะให้ผลลัพธ์เดียวกันแม้ว่าพวกเขาจะมีไฟล์ที่มี เนื้อหาที่แตกต่าง ฉันไม่แน่ใจด้วยซ้ำว่าจะกำหนด MD5Sum ของไดเรกทอรีได้อย่างไร
Kibbee

1

เป็นกรณีเฉพาะสมมติว่าคุณต้องการคัดลอกไฟล์บางส่วนจาก directory1 ไปยัง directory2 แล้วคุณต้องการตรวจสอบสำเนาที่ประสบความสำเร็จโดยใช้การเปรียบเทียบ md5

เป็นครั้งแรก cd ไปที่ directory1 และพิมพ์:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

ซึ่งจะสร้างไฟล์อ้างอิงที่มีผลรวม md5 สำหรับแต่ละไฟล์ใน directory1 เมื่อเสร็จแล้วสิ่งที่คุณต้องทำคือ cd to directory2 และพิมพ์:

md5sum -c ~/Desktop/md5sum.txt

โปรแกรม md5sum ดึงข้อมูลแต่ละพา ธ จากไฟล์ md5sum.txt คำนวณ md5sum ของไฟล์นั้นในโฟลเดอร์ปลายทางแล้วเปรียบเทียบกับผลรวมที่เก็บไว้ในไฟล์

หลังจากกระบวนการเสร็จสมบูรณ์คุณจะได้รับการสรุปเช่น 'ดังนั้นไฟล์จำนวนมากจึงไม่ตรงกัน' หรืออะไรทำนองนั้น


1
การอ้างอิง: ubuntugenius.wordpress.com/2009/11/17/…
Joel

1

ฉันต้องการตรวจสอบความสมบูรณ์ของการสำรองข้อมูล / มิเรอร์ซึ่งมีไฟล์จำนวนมากและจบลงด้วยการเขียนโปรแกรมบรรทัดคำสั่งที่เรียกว่า MassHash มันเขียนใน Python มีตัวเรียกใช้ GTK + คุณอาจต้องการตรวจสอบ ...

http://code.google.com/p/masshash/

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