क्या फ़ोल्डर में MD5 (या समान) है? यदि दो फ़ोल्डर समान हैं, तो कैसे सत्यापित करें?


10

मैं md5sumएक फ़ोल्डर (या समान गणना) को एक संग्रह में संपीड़ित किए बिना खोजना चाहता हूं ।

उदाहरण के लिए, यदि फ़ोल्डर में MyFolderहमारे पास फ़ाइलें हैं 1.txt, 2.txtऔर 3.txt, जिसमें:


1.txt

1. पाठ में पाठ

2.txt

2. पाठ में पाठ

3.txt

3. पाठ में पाठ


मैं 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 Thx a lot।
गरौदान

@GarouDan। आपके द्वारा दिखाई गई कमांड प्रतीकात्मक लिंक का अनुसरण करेगी। आप -oफ़ाइल प्रकारों को संभालने के लिए विकल्प का उपयोग कर सकते हैं ।
पीटर.ऑक्ट

ओह thx ... पता नहीं है कि ... वास्तव में उपयोगी। मैं याद रखूंंगा!
गरौदान

4

यदि आप इसे संग्रहीत नहीं करना चाहते हैं, तो शायद आप ऐसा कुछ कर सकते हैं

diff <(find folder1) <(find folder2)

आपको findअधिक सटीक होने के लिए आदेशों को अनुकूलित करना पड़ सकता है ।

संपादित करें आप -execफ़ाइलों की सामग्री की तुलना करने के लिए अपने खोज कॉल में जोड़ सकते हैं । इसके समान कुछ:

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

याद रखें कि आप इसे अनुकूलित करना चाहते हैं।


यह एक दिलचस्प बिंदु है। यह प्रत्येक फ़ोल्डर की सभी फ़ाइलों को सूचीबद्ध करता है ... लेकिन अगर मेरे पास बहुत बड़ी मात्रा में अभिलेखागार हैं ... तो कैसे सत्यापित कर सकते हैं कि प्रत्येक फ़ोल्डर में एक ही फाइलें (डेटा के साथ - शायद md5sum उपकरण का उपयोग करके) हैं?
गरौदान

1
फिर प्रत्येक फ़ाइल के MD5SUM आउटपुट का एक अंतर करें। आपको बस एक साथ स्ट्रिंग, md5sum को मिलाना होगा और अलग-अलग कमांड को अलग करना होगा।
सिब्रॉन

अपने विचारों के बारे में भी, cya ... मैं इन कामों के साथ दिलचस्प चीजों की कोशिश करूँगा ... धन्यवाद के बाद।
गरुडदान

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 और इसके उपनिर्देशिकाओं में फ़ाइलों की संख्या की जाँच करता है)।


यह एक अच्छी स्क्रिप्ट है ... thx @ क्रिस। लेकिन यह एक समस्या है ... बिल्ली का उपयोग करते हुए , सबफ़ोल्डर्स त्रुटियों के साथ क्रैश हो जाता है ... क्या आपको इसे हल करने का विचार है? बहुत धन्यवाद।
गरौदान

यह मेरे लिए ठीक काम करता है। सुनिश्चित करें कि आपका शेल समर्थन करता है globstar। त्रुटि क्या है?
क्रिस डाउन

1
यह "काम करता है" (+1) ... लेकिन बैश 4 में ग्लोबस्टार निर्देशिका सिम्बलिंक का अनुसरण करता है , लेकिन यह केवल एक समस्या है यदि निर्देशिका में सिमिलिंक शामिल है।
पीटर.ऑक्ट

@ अच्छा कॉल, मैंने एक परीक्षण में जोड़ा।
क्रिस डाउन

0

मैंने देखा कि मूल पोस्ट पुरानी है, हालाँकि, मुझे लगता है कि यह जानकारी अभी भी उन लोगों के लिए मूल्यवान हो सकती है जो यह सत्यापित करने के लिए कि फाइलों को सही तरीके से कॉपी किया गया है। रुपीक्स डेटा कॉपी करने का सबसे अच्छा तरीका हो सकता है और इस धागे में दिए गए उत्तर अच्छे हैं, हालांकि उन लोगों के लिए जो लिनक्स के साथ अनुभवी नहीं हैं, मैं अधिक विस्तृत विवरण देने की कोशिश करूंगा।

परिदृश्य: आपने बहुत सी उप-निर्देशिकाओं और फ़ाइलों के साथ एक डिस्क से दूसरे में डेटा कॉपी किया है। आप सत्यापित करना चाहते हैं कि सभी डेटा सही तरीके से कॉपी किए गए हैं।

पहले चेक करें कि md5deep कमांड जारी करके स्थापित किया गया है md5deep -v

यदि आपको 'कमांड नहीं मिला' जैसी कोई बात कहते हुए संदेश मिलता है, तो md5deep द्वारा स्थापित करें apt-get install md5deep

यह माना जाता है कि आप केवल नियमित फ़ाइलों से निपटना चाहते हैं। यदि आप अन्य प्रकार की फ़ाइलों से निपटना चाहते हैं, तो md5deep मैनुअल में -o फ्लैग को देखें। ( man md5deep)

अब आप जाने के लिए अच्छे हैं, और हम मान लेते हैं कि आपने जिन फ़ाइलों का उपयोग कर रहे हैं, उनके /mnt/orginalलिए फ़ाइलों को /mnt/backupइनसे कॉपी किया है ।

स्रोत निर्देशिका में पहला परिवर्तन, यह आपके द्वारा कॉपी या बैकअप की गई फ़ाइलों का मूल स्रोत है:

cd /mnt/orginal

फिर प्रत्येक फ़ाइल का एक चेकसम बनाएँ:

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

इस कमांड ने समझाया:

-r पुनरावर्ती मोड सक्षम करता है

-e प्रगति संकेतक प्रदर्शित करता है

-l सापेक्ष फ़ाइल पथ सक्षम करता है।

-o f केवल नियमित फाइलों पर काम करें (उपकरणों को ब्लॉक न करें, नामांकित पाइप आदि)

. वर्तमान निर्देशिका में शुरू करने के लिए md5deep बताता है।

>> /tmp/checksums.md5md5deep को सभी आउटपुट को रीडायरेक्ट करने के लिए कहता है /tmp/checksums.md5

ध्यान दें, यदि आप पिछले संस्करणों में सामग्री को अधिलेखित करना चाहते हैं, तो /tmp/checksums.md5उपयोग करें >और नहीं>>

ध्यान दें कि यह कमांड काफी समय ले सकता है, जो कि io- गति और डेटा के आकार पर निर्भर करता है। आप md5deep के प्रदर्शन को बढ़ाने के लिए अच्छा और / या आयनी के साथ प्रयोग कर सकते हैं, लेकिन यह इस उत्तर के दायरे से बाहर है।

जब चेक sums का निर्माण समाप्त हो गया है, तो आपके पास अब एक फ़ाइल है जिसमें प्रविष्टियां समान हैं:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f7c779a14332f9fa7bb368039210/etconfig-11.in/etc.in/etc3/etc.in/etc.in/ /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.ache

पहला कॉलम md5 चेक योग है, और दूसरा कॉलम चेकसम से संबंधित फाइल के सापेक्ष पथ है।

यदि आप देखना चाहते हैं कि चेकसम फाइल में कितनी फाइलें मौजूद हैं, तो कमांड जारी करें:

wc /tmp/checksums.md5 -l

अब, आप जांचना चाहते हैं कि कॉपी किया गया डेटा सही है:

cd /mnt/backup

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

जब हमने चेकसम बनाया है तब से केवल एक ही अंतर है -X जो किसी फ़ाइल के वर्तमान हैश को प्रदर्शित करता है यदि चेकसमों। Dd5 फ़ाइल में प्रविष्टि मेल नहीं खाती है। इसलिए परीक्षण के अंत तक, यदि /tmp/compare.resultरिक्त है, तो आप भरोसा कर सकते हैं कि चेकसम के मिलान के बाद से सभी फाइलें सही तरीके से कॉपी की गई हैं।

ध्यान दें कि /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मुद्रित होने वाली सभी पंक्तियों को बनाने के लिए मिलाfindpath1cd /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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.