มี MD5 (หรือคล้ายกัน) ไปยังโฟลเดอร์หรือไม่? จะตรวจสอบได้อย่างไรว่ามีสองโฟลเดอร์เท่ากัน?


10

ฉันต้องการค้นหาmd5sum(หรือการคำนวณที่คล้ายกัน) ของโฟลเดอร์โดยไม่บีบอัดลงในไฟล์เก็บถาวร

ตัวอย่างเช่นถ้าในโฟลเดอร์MyFolderที่เรามีไฟล์1.txt, 2.txtและ3.txtมี:


1.txt

ข้อความเป็น 1.txt

2.txt

ข้อความเป็น 2.txt

3.txt

ข้อความเป็น 3.txt


ฉันจะคำนวณmd5sumจำนวนทั้งหมดได้MyFolderอย่างไร มีวิธีหรือไม่? ฉันต้องการใช้สิ่งนี้เพื่อตรวจสอบว่าสองโฟลเดอร์มีเนื้อหาเหมือนกันหรือไม่

สามารถใช้เพื่อตรวจสอบว่าซีดีหรือโฟลเดอร์สองอันเท่ากัน ฉันต้องการวิธีง่ายๆในการทำ

คำตอบ:


15

md5deepเครื่องมือที่ถูกพัฒนาขึ้นเพื่อวัตถุประสงค์นี้ได้อย่างแม่นยำ ลีนุกซ์หลายรุ่นมีอยู่ในแพ็คเกจ


1
ขอบคุณ! มันทำงานได้ดีสำหรับฉัน ผู้ใช้รายอื่นที่มีปัญหาเดียวกันจะชอบสิ่งนี้: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory ขอบคุณมาก
GarouDan

@GarouDan คำสั่งที่คุณแสดงจะเป็นไปตามลิงก์สัญลักษณ์ คุณสามารถใช้-oตัวเลือกเพื่อจัดการประเภทไฟล์
Peter.O

โอ้ขอบคุณ ... ไม่รู้ว่า ... ช่วยได้จริงๆ ฉันจะจำได้!
GarouDan

4

หากคุณไม่ต้องการเก็บถาวรคุณอาจทำสิ่งนี้

diff <(find folder1) <(find folder2)

คุณอาจต้องปรับfindคำสั่งให้แม่นยำยิ่งขึ้น

แก้ไข คุณสามารถเพิ่ม-execในการโทรหาเพื่อเปรียบเทียบเนื้อหาของไฟล์ สิ่งที่คล้ายกับสิ่งนี้:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

จำไว้ว่าคุณอาจต้องการที่จะปรับตัวนี้


มันเป็นจุดที่น่าสนใจ รายการนี้แสดงไฟล์ทั้งหมดของแต่ละโฟลเดอร์ ... แต่ถ้าฉันมีเอกสารจำนวนมากจริงๆ ... จะตรวจสอบได้อย่างไรว่ามีไฟล์เดียวกัน (ด้วยข้อมูล - อาจใช้เครื่องมือ md5sum) ในแต่ละโฟลเดอร์?
GarouDan

1
จากนั้นทำส่วนต่างของเอาต์พุต MD5SUM ของแต่ละไฟล์ คุณเพียงแค่ต้องรวมสตริงคำสั่ง find, md5sum และ diff ต่างกัน
sybreon

ขอบคุณเกี่ยวกับความคิดของคุณเช่นกัน cya ... ฉันจะลองสิ่งที่น่าสนใจกับคำสั่งค้นหาเหล่านี้หลังจาก ... ขอบคุณ
GarouDan

3

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

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

ถ้าคุณอย่างแท้จริงเกี่ยวกับการดูแลชื่อไฟล์ ฯลฯ คุณสามารถใช้ห่วงเพื่อเปรียบเทียบสิ่งที่อยู่ในและ${_files_in_old_dir} ${_files_in_new_dir}สิ่งนี้ควรใช้งานได้ในกรณีส่วนใหญ่ (อย่างน้อยก็ตรวจสอบจำนวนไฟล์ใน dir และไดเรกทอรีย่อย)


นี่เป็นสคริปต์ที่ดี ... ขอบคุณ @Chris แต่มันมีปัญหา ... โดยใช้catโฟลเดอร์ย่อยล้มเหลวด้วยข้อผิดพลาด ... คุณมีความคิดที่จะแก้ปัญหาหรือไม่ ขอบคุณมาก.
GarouDan

มันใช้งานได้ดีสำหรับฉัน globstarตรวจสอบให้แน่ใจสนับสนุนเปลือกของคุณ ข้อผิดพลาดคืออะไร?
Chris Down

1
มัน "ใช้งานได้" (+1) ... แต่globstar ใน bash 4 ติดตาม symlink ของไดเรกทอรีแต่นั่นเป็นเพียงปัญหาหากไดเรกทอรีใดลิงก์หนึ่งมี symlink
Peter.O

@fered การโทรที่ดีฉันเพิ่มในการทดสอบ
Chris Down

0

ฉันสังเกตเห็นว่าโพสต์ดั้งเดิมค่อนข้างเก่า แต่ฉันคิดว่าข้อมูลนี้ยังคงมีประโยชน์สำหรับผู้ที่กำลังมองหาวิธีการตรวจสอบว่ามีการคัดลอกไฟล์อย่างถูกต้อง Rsync อาจเป็นวิธีที่ดีที่สุดในการคัดลอกข้อมูลและคำตอบที่ให้ไว้ในเธรดนี้เป็นสิ่งที่ดี แต่สำหรับผู้ที่ไม่ได้มีประสบการณ์กับ Linux ฉันจะพยายามอธิบายรายละเอียดเพิ่มเติม

สถานการณ์จำลอง: คุณเพิ่งคัดลอกข้อมูลจากดิสก์ไปยังอีกที่หนึ่งพร้อมด้วยไดเรกทอรีย่อยและไฟล์จำนวนมาก คุณต้องการตรวจสอบว่าข้อมูลทั้งหมดจะถูกคัดลอกอย่างถูกต้อง

แรกตรวจสอบว่ามีการติดตั้ง md5deep md5deep -vโดยการออกคำสั่ง

หากคุณได้รับข้อความว่าบางสิ่งบางอย่างเช่น 'คำสั่งไม่พบ' apt-get install md5deepแล้วติดตั้งโดย

จะถือว่าคุณต้องการจัดการกับไฟล์ปกติเท่านั้น หากคุณต้องการจัดการกับไฟล์ประเภทอื่น ๆ ให้อ้างถึงแฟล็ก -o ในคู่มือ md5deep ( man md5deep)

ตอนนี้คุณก็พร้อมแล้วและเราคิดว่าคุณคัดลอกไฟล์จาก/mnt/orginalไปยัง/mnt/backupแทนที่ไฟล์เหล่านี้สำหรับไดเรกทอรีใด ๆ ที่คุณใช้งานอยู่

อันดับแรกเปลี่ยนเป็นไดเรกทอรีต้นทางนี่คือต้นฉบับสำหรับไฟล์ที่คุณคัดลอกหรือสำรอง:

cd /mnt/orginal

จากนั้นทำการตรวจสอบไฟล์แต่ละไฟล์:

md5deep -rel -o f . >> /tmp/checksums.md5

คำสั่งนี้อธิบาย:

-r เปิดใช้งานโหมดเรียกซ้ำ

-e แสดงตัวบ่งชี้ความคืบหน้า

-l เปิดใช้งานพา ธ ไฟล์ที่เกี่ยวข้อง

-o f ใช้งานได้กับไฟล์ปกติเท่านั้น (ไม่ปิดกั้นอุปกรณ์ชื่อไปป์ ฯลฯ )

. บอก md5deep ให้เริ่มในไดเรกทอรีปัจจุบัน

>> /tmp/checksums.md5บอก md5deep /tmp/checksums.md5เปลี่ยนเส้นทางออกทั้งหมดเพื่อ

หมายเหตุหากคุณต้องการเขียนทับเนื้อหาในเวอร์ชันก่อนหน้า/tmp/checksums.md5ให้ใช้>และไม่ใช้>>

โปรดทราบว่าคำสั่งนี้อาจใช้เวลาสักครู่ขึ้นอยู่กับ io-speed และขนาดของข้อมูล คุณสามารถทดลองกับ nice และ / หรือ ionice เพื่อเพิ่มประสิทธิภาพของ md5deep แต่นั่นอยู่นอกขอบเขตของคำตอบนี้

เมื่อสร้างผลรวมตรวจสอบเสร็จแล้วตอนนี้คุณมีไฟล์ที่มีรายการคล้ายกับ:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/pf61d9fcfcfcfcfcf5f5a7f9a7c9f9a7c9a /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

คอลัมน์แรกคือผลรวมตรวจสอบ md5 และคอลัมน์ที่สองคือเส้นทางสัมพัทธ์ไปยังไฟล์ที่มีค่าตรวจสอบอยู่

หากคุณต้องการดูจำนวนไฟล์ที่มีอยู่ในไฟล์เช็คซัมให้ใช้คำสั่ง:

wc /tmp/checksums.md5 -l

ตอนนี้คุณต้องการตรวจสอบว่าข้อมูลที่คัดลอกนั้นถูกต้อง:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

ข้อแตกต่างจากเมื่อเราสร้าง checksums คือ -X ซึ่งแสดงแฮชปัจจุบันของไฟล์หากรายการในไฟล์ checksums.md5 ไม่ตรงกัน ดังนั้นเมื่อสิ้นสุดการทดสอบหาก/tmp/compare.resultว่างเปล่าคุณสามารถเชื่อถือได้ว่าไฟล์ทั้งหมดจะถูกคัดลอกอย่างถูกต้องตั้งแต่ checksums ตรงกัน

โปรดทราบว่าเฉพาะไฟล์ที่อยู่ใน/tmp/checksums.md5ไฟล์เท่านั้นที่จะถูกตรวจสอบเพื่อตรวจสอบความถูกต้องหากมีไฟล์เพิ่มเติมใด ๆ ใน/mnt/backupไดเรกทอรี md5deep จะไม่แจ้งให้คุณทราบเกี่ยวกับสิ่งเหล่านี้

หมายเหตุ:

  • คุณไม่จำเป็นต้องใช้การเปลี่ยนเส้นทางเพื่อจัดเก็บไฟล์เอาต์พุต อ้างถึงคู่มือ md5deep สำหรับข้อมูลเพิ่มเติม

  • คุณอาจต้องเรียกใช้คำสั่ง md5deep ในฐานะรูททั้งนี้ขึ้นอยู่กับการอนุญาตของไฟล์ที่คุณจัดการ


0

หากคุณต้องการที่จะตรวจสอบซ้ำแตกต่างระหว่างสองไดเรกทอรี/path1และ/path2 โดยไม่ต้องใช้md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

คำอธิบาย:

  • เข้าสู่path1บรรทัดทั้งหมดที่พิมพ์โดยfindสัมพันธ์กับpath1( cd /path1)
  • แสดงรายการไฟล์ทั้งหมดซ้ำในเส้นทางปัจจุบัน ( && find . -type f)
  • ใช้เอาต์พุตแต่ละบรรทัดโดยfindเป็นอินพุตสำหรับmd5( | xargs md5)

ผลลัพธ์จะมีลักษณะเช่นนี้หากมีความแตกต่าง:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.