สร้างการตรวจสอบ md5 สำหรับไฟล์ทั้งหมดในไดเรกทอรี


75

ฉันต้องการสร้างรายการตรวจสอบ md5 สำหรับไฟล์ทั้งหมดในไดเรกทอรี

cat filename | md5sum > ouptput.txtฉันต้องการที่จะ ฉันต้องการทำสิ่งนี้ในขั้นตอนที่ 1 สำหรับไฟล์ทั้งหมดในไดเรกทอรีของฉัน

ความช่วยเหลือใด ๆ จะดีมาก


ฉันจะค้นหา md5sum (checksum) ของไฟล์สำรองที่ระบุได้อย่างไร - สคริปต์ของฉันควรมีลักษณะอย่างไร - คำสั่งนั้นคืออะไร

คำตอบ:


110

คุณสามารถผ่านmd5sumชื่อไฟล์หลายรายการหรือการขยายทุบตี:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

หากคุณต้องการจินตนาการคุณสามารถใช้สิ่งต่าง ๆ เช่นfindเจาะลึกและกรองไฟล์รวมถึงการทำงานซ้ำ:

find -type f -exec md5sum "{}" + > checklist.chk

1
♦วิธีการใช้งานด้านบนเพื่อรับmd5sumไฟล์ภายในไดเรคทอรีย่อยการmd5sum *เปล่งไปสู่ระดับไดเรกทอรีย่อยโดยการพูดว่า ... เป็นได
เร

ขออภัยที่ถามโดยการเรียกใช้find -type f -exec md5sum '{}' +และ `ค้นหา -type f -exec md5sum '{}'` ฉันสามารถรับมันได้ ขอบคุณ :)
Kasun Siyambalapitiya

ฉันชอบรูปลักษณ์ของผลลัพธ์นี้มากขึ้น:openssl md5 * > checklist.txt
แอชลีย์

1
หากคุณใช้เชลล์ที่มีความสุขในการประเมิน**แบบเรียกซ้ำ (เช่น zsh) มันง่ายกว่ามาก:md5sum **/* 2>/dev/null
Joost

12

โปรแกรมการสร้าง / ตรวจสอบการตรวจสอบที่ยอดเยี่ยมคือ rhash มันสร้างแม้กระทั่งไฟล์ที่เข้ากันได้กับ SFV และตรวจสอบด้วย

รองรับ md4, md5, sha1, sha512, crc32 และอื่น ๆ อีกมากมาย

นอกจากนี้ยังสามารถทำการสร้างซ้ำ (ตัวเลือก -r) เช่น md5deep หรือ sha1deep

สุดท้าย แต่ไม่ท้ายสุดคุณสามารถฟอร์แมตเอาต์พุตของไฟล์เช็คซัม ตัวอย่างเช่น:

rhash --md5 -p '%h,%p\n' -r /home/

ส่งออกไฟล์ CSV รวมถึงเส้นทางแบบเต็มของไฟล์ซ้ำเริ่มต้นด้วย/homeไดเรกทอรี

ฉันพบว่ามีประโยชน์อย่างยิ่งแม้แต่ตัวเลือก -e เปลี่ยนชื่อไฟล์โดยการใส่ผลรวม crc32 เป็นชื่อ

คุณสามารถเปลี่ยน "md5sum" ด้วย "rhash" ในตัวอย่าง PhoenixNL72


1
'/ home /' ทำอะไรที่นี่? เครื่องมือนี้ดูค่อนข้างดี
Andy Ibanez

ฉันคิดว่ามันเป็นข้อผิดพลาดข้อผิดพลาดอย่างแน่นอนสำหรับฉัน -p เป็นรูปแบบสำหรับเอาต์พุต ฉันจะแก้ไขมัน
pbhj

7

นี่คือตัวอย่างที่ครอบคลุมมากขึ้นอีกสองตัวอย่าง:

  1. สร้างไฟล์ md5 ในแต่ละไดเรกทอรีซึ่งยังไม่มีไฟล์โดยมีพา ธ สัมบูรณ์:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. สร้างไฟล์ md5 ในแต่ละโฟลเดอร์ซึ่งยังไม่มีไฟล์: ไม่มีพา ธ , ชื่อไฟล์เท่านั้น:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

สิ่งที่แตกต่างระหว่าง 1 และ 2 คือวิธีการนำเสนอไฟล์ในไฟล์ md5 ที่ได้

คำสั่งทำสิ่งต่อไปนี้:

  1. สร้างรายการชื่อไดเรกทอรีสำหรับโฟลเดอร์ปัจจุบัน (ต้นไม้)
  2. เรียงลำดับรายการโฟลเดอร์
  3. เช็กอินแต่ละไดเร็กทอรีหากไฟล์ @ md5sum.md5 มีอยู่ เอาท์พุทข้ามถ้ามันมีอยู่การประมวลผลเอาท์พุทถ้ามันไม่อยู่
  4. หากไฟล์ @ md5Sum.md5 ไม่มีอยู่ md5Sum จะสร้างขึ้นมาหนึ่งไฟล์ด้วย checksums ของไฟล์ทั้งหมดในโฟลเดอร์ 5) ตั้งค่าไฟล์ @ md5Sum.md5 ที่สร้างขึ้นเพื่ออ่านอย่างเดียว

เอาต์พุตของสคริปต์ทั้งหมดนี้สามารถถูกเปลี่ยนเส้นทางไปยังไฟล์ (..... ; Done> test.log) หรือไพพ์ไปยังโปรแกรมอื่น (เช่น grep) ผลลัพธ์จะบอกคุณเพียงไดเรกทอรีที่ข้ามและที่ได้รับการประมวลผล

หลังจากการรันสำเร็จคุณจะจบลงด้วยไฟล์ @ md5Sum.md5 ในแต่ละไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันของคุณ

ฉันตั้งชื่อไฟล์ @ md5Sum.md5 ดังนั้นมันจะแสดงรายการที่ด้านบนสุดของไดเรกทอรีในการแบ่งปันแซมบ้า

การตรวจสอบไฟล์ @ md5Sum.md5 ทั้งหมดสามารถทำได้โดยคำสั่งถัดไป:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

หลังจากนั้นคุณสามารถ grep checklog.txt โดยใช้ grep -v ตกลงเพื่อรับรายการไฟล์ทั้งหมดที่แตกต่างกัน

หากต้องการสร้าง @ md5Sum.md5 ใหม่ในไดเรกทอรีเฉพาะเมื่อคุณเปลี่ยนหรือเพิ่มไฟล์เช่นลบไฟล์ @ md5Sum.md5 หรือเปลี่ยนชื่อและเรียกใช้คำสั่งสร้างอีกครั้ง


คำสั่ง # 1 ที่ใช้พา ธ แบบเต็ม: md5sum "$ {dir}" / * ไม่ได้เก็บไฟล์ที่ซ่อนอยู่ที่เริ่มต้นด้วยจุด วิธีการรักษาใด ๆ
user14654

ไปงานปาร์ตี้ แต่เนื่องจาก md5sum ต้องการชื่อไฟล์ (ดูเหมือนว่าไม่พอใจถ้าคุณให้ไดเรกทอรี) มันอาจจะง่ายที่สุดในการขอความช่วยเหลือ: $ md5sum $ (หา "$ dir" -maxdepth 0 -type f) The "- พิมพ์ f "ดึงไฟล์ปกติและไฟล์. hidden (เช่นกันค้นหามีตัวเลือกมากมาย แต่มีประโยชน์มาก) งดส่วน "-maxdepth 0" ถ้าคุณต้องการทุกอย่างซ้ำ หมายเหตุ: นี่เป็นกรณีที่บอบบางหากชื่อไฟล์มีการเว้นวรรคคุณสามารถอ่านค่า xargs และ -0 ( en.wikipedia.org/wiki/Xargs )
jgreve

0

ฉันพบปัญหานี้และในขณะที่การแก้ปัญหาข้างต้นนั้นสวยงามฉันต้องการแฮ็คที่รวดเร็วและสกปรกสำหรับสถานการณ์นี้: 1 ไดเรกทอรีโดยมีไดเรกทอรีย่อยหนึ่งระดับที่อยู่ลึกเข้าไปในนั้น

ดังนั้นเข้าสู่ไดเรกทอรีในเปลือกและเรียกใช้:

md5sum * */* 2>/dev/null > md5sum.md5

สิ่งนี้จะได้รับไฟล์ทั้งหมดในไดเรกทอรีระดับบนสุดลบคำเตือนข้อผิดพลาดเกี่ยวกับไดเรกทอรีย่อยที่เป็นไดเรกทอรีแล้วเรียกใช้ md5sums บนเนื้อหาไดเรกทอรีย่อย ข้อได้เปรียบ: ง่ายต่อการจดจำทำสิ่งที่ควรจะทำ ฉันมักจะสับสนด้วยการค้นหาไวยากรณ์และไม่สามารถจำมันได้จากด้านบนของหัวของฉันดังนั้นไม่จำเป็นต้องวนซ้ำ ฯลฯ จัดการกับช่องว่างในชื่อไดเรกทอรีหนึ่งซับนี้ทำงานได้ดี ไม่ใช่โซลูชันที่แข็งแกร่งและทรงประสิทธิภาพไม่ดีสำหรับไดเรกทอรีย่อย> ระดับ 1 แต่สามารถแก้ไขปัญหาได้อย่างรวดเร็วและง่ายดาย

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