प्रगति रिपोर्ट के साथ बड़े पैमाने पर निर्देशिकाओं की तुलना करें


13

मैं बस rsync-ed 2,000,000 फ़ाइलें (3TB) एक से दूसरे RAID।

मैं यह सुनिश्चित करना चाहता हूं कि मेरा डेटा बरकरार रहे।

rsync -c वास्तव में लंबा समय लगता है।

diff मुझे नहीं दिखा कि यह क्या कर रहा है।

क्या कोई विकल्प है जो (ए) तेजी से है, और (बी) इसकी तुलना करते समय मुझे प्रगति दिखाएगा?

(मैं मैक पर हूं, और brew search diffमुझे देता है apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... क्या इनमें से कोई एक काम करेगा?)


डुप्लिकेट superuser.com/questions/708001/...
spuder

मैं भी उलझन में हूँ कि rsyncलगभग १५० एमबी / एस पर डेटा की प्रतिलिपि क्यों बनाई गई, फिर भी diffकेवल ६० एमबी / एस की तुलना में ...?
दान

1
डिफ़ॉल्ट रूप rsyncसे उपयोग करने वाली कॉपी तेजी से b / c rsyncहै फाइलों की तुलना करने के लिए चेकसम का उपयोग नहीं करता है, यह आकार और तारीख की जानकारी को देखता है। जब आप rsync -cसभी फाइलों का उपयोग करते हैं, तो उनके चेकसम की गणना करने की आवश्यकता होती है जो कि एक बोझिल काम है, इसलिए यह डिफ़ॉल्ट नहीं है।
स्लम

हां, लेकिन अलग कॉपी नहीं है ... यह सिर्फ दोनों फाइलों को पढ़ता है; rsync करते समय, कॉपी करने के लिए, प्रत्येक बाइट को अवश्य पढ़ें, फिर इसे लिखें। यह खरोंच से rsync था, इसलिए यह हर फ़ाइल की प्रतिलिपि बना रहा था।
दान

जवाबों:


6

सुधार और विकल्प स्पष्टता के लिए संपादन - मैं भूल गया - 'दुख'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

और जो आप तुलना कर रहे हैं उसके आधार पर स्वाद के लिए अन्य विकल्प जोड़ें:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs ओरिजिनल और कॉपी के हर बाइट को पढ़ेगा, और रिपोर्ट की गई फाइलों को समान करेगा।

पोसिक्स द्वारा भिन्न आउटपुट प्रारूप को परिभाषित किया गया है, इसलिए यह बहुत पोर्टेबल है। आप कुछ जोड़ना चाह सकते हैं जैसे:

| टी डिफरेंस-आउट १ | grep -v -Ee 'फ़ाइलें। * और। * समान हैं'

आप chksums या hashes का उपयोग कर सकते हैं, लेकिन फिर आपको उन्हें फ़ाइल पेड़ों के साथ सिंक करना होगा, इसलिए आप हर फ़ाइल के हर बाइट को वैसे भी पढ़ने के लिए वापस आ जाएंगे।

EDIT - प्रतिक्रिया के लिए एक टिप्पणी के रूप में बहुत लंबा है:

10GB से अधिक की फाइलें सत्यापित नहीं हो रही हैं

आप इस भिन्न विकल्प को आज़माना चाहते हैं: --speed-large-files

यह संभव है कि आप जिस फॉर्म का उपयोग कर रहे हैं वह बहुत बड़ी फ़ाइलों (उदाहरण के लिए सिस्टम मेमोरी से बड़ी) के साथ अच्छी तरह से मुकाबला नहीं कर रहा है, और इस प्रकार उन फ़ाइलों के बीच अंतर की रिपोर्ट कर रहा है जो वास्तव में समान हैं।

मैंने सोचा था कि वहाँ एक -एच विकल्प या एक 'bdiff' है जो बड़ी फ़ाइलों पर बेहतर करता है, लेकिन मुझे फेडोरा में एक नहीं मिल सकता है। मेरा मानना ​​है कि --स्पीड-लार्ज-फाइल्स विकल्प '-h' "हाफ-हार्टेड तुलना" विकल्प का उत्तराधिकारी है।

आपके द्वारा उपयोग किए गए rsync आदेश को दोहराने के लिए एक अलग तरीका होगा, '-vin' (क्रिया, आइटम, no_un) के साथ। यह किसी भी अंतर की रिपोर्ट करेगा जो rsync पाता है - और कोई भी नहीं होना चाहिए।

कुछ फ़ाइलों को स्थानांतरित करने के लिए, आप एक स्क्रिप्ट देख रहे हैं जैसे:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

लेकिन मैं ऐसा करने की सलाह नहीं देता। अंतर्निहित प्रश्न "मैं कैसे सुनिश्चित कर सकता हूं कि rsync ने फ़ाइल पदानुक्रम को सही तरीके से कॉपी किया है?" और यदि आप अपने आप को प्रदर्शित कर सकते हैं कि rsync अच्छी तरह से काम कर रहा है, अंतर या किसी अन्य उपकरण के साथ, तो आप बस इसके चारों ओर काम करने के बजाय rsync पर भरोसा कर सकते हैं।

rsync -vin आपके द्वारा दिए गए अन्य विकल्पों के आधार पर तुलना करेगा। मैंने सोचा कि यह चेकसम के लिए डिफ़ॉल्ट है, लेकिन आप सही हैं, उसके लिए -c या --checksum आवश्यक है।

टेक्स्ट की लाइनों की फ़ाइलों के लिए वास्तव में अलग उपयोगिता का इरादा है, लेकिन यह बाइनरी फ़ाइलों के लिए 'समान' अंडर-एस की रिपोर्ट करना चाहिए।

Thebrief को किसी भी फ़ाइल सामग्री आउटपुट को दबा देना चाहिए - इसे पहले देखने की मेरी माफी - यह एक बदसूरत स्क्रिप्ट में अर्ध-दफन था।


क्या mvड्राइव के रूट पर "सत्यापित" फ़ोल्डर में मिलने वाली प्रत्येक फ़ाइल को प्राप्त करने का एक तरीका है , पूर्ण पथ को संरक्षित करना? जैसे, यदि /disk1/a/b/c/file1समान है /disk2/a/b/c/file1, तो उसे स्थानांतरित करें /disk1/verified/a/b/c/file1। तब मैं केवल बुरी तरह से कॉपी की गई फ़ाइलों के साथ समाप्त हो सकता था। (अब तक 10GB से अधिक फ़ाइलों का सत्यापन नहीं हो रहा है, जो डरावना है।)
Dan

आप इस विकल्प को आजमाना चाहेंगे: --speed-large-files
D McKeon

ऐसा क्या करता है?
डैन

अगर मैं दौड़ता हूं rsync -vin- तो क्या वह बाइट-बाय-बाइट या चेकसम तुलना करता है? मैंने सोचा था कि rsync केवल आकार / तिथि की तुलना करता है जब तक आप जोड़ते नहीं हैं -c। और जो मैंने पढ़ा है उससे speed large filesलगता है कि केवल गैर-बाइनरी फ़ाइलों के साथ फर्क पड़ता है ... या क्या मैं गलत हूं?
दान

diffमुझे "Files __ and ___ differ"... के रूप में परिणाम देता है और मैं sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"कोशिश कर रहा हूं कि खराब फाइलों को फिर से कॉपी करने के लिए एक स्क्रिप्ट तैयार करूं । लेकिन अलग-अलग आउटपुट अयोग्य है, इसलिए यह काम नहीं करता है। क्या मुझे इसे उद्धृत पथ दिए जा सकते हैं?
डैन

4

यहाँ diffफ़ाइल गणना के आधार पर प्रगति रिपोर्ट के साथ है:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

आपको pv (पाइप दर्शक) की आवश्यकता होगी: http://www.ivarch.com/programs/pv.shtml

स्पष्टीकरण:

  • diff -r निर्देशिका और उपनिर्देशिका की तुलना पुनरावर्ती करें।
  • diff -qफ़ाइलों के केवल फ़ाइल नाम अलग-अलग प्रिंट करें। वास्तविक अंतर न छापें।
  • diff -sउन फ़ाइलों का फ़ाइल नाम भी प्रिंट करें जो अलग नहीं हैं। प्रगति की जानकारी के लिए यह महत्वपूर्ण है।
  • pv -l लाइन काउंट के आधार पर रिपोर्ट की प्रगति।
  • pv -s count गणना के आधार पर पूरा करने का समय अनुमान।
  • के लिए पुनर्निर्देशन logfileसुंदर उत्पादन के लिए है। अन्यथा से आउटपुट diffस्टेटस लाइन से मिक्स हो जाएगा pv

फाइल कमांड प्राप्त करने के लिए निम्नलिखित कमांड का उपयोग करें:

find dir1 -type f | wc -l

उन फ़ाइलों के लिए लॉगफ़ाइल को फ़िल्टर करें जो अलग हैं:

grep -v "^Files .* identical$" logfile

यह भिन्नता उन फ़ाइलों को प्रिंट करेगी जो वास्तविक समय में भिन्न हैं, जबकि सब कुछ लॉग इन करते हुए logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

वैकल्पिक रूप से आप केवल उन्हीं फ़ाइलों को लॉग इन कर सकते हैं जो अलग हैं:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

नोट: उपरोक्त आदेश फ़ाइल गणना के आधार पर प्रगति की रिपोर्ट करेंगे। यह सबसे अच्छा काम करता है अगर कई छोटी फाइलें हैं। अगर आपके पास कुछ बहुत बड़ी फाइलें हैं तो आपको इसमें ज्यादा मजा नहीं आएगा।

अफसोस की बात है कि मैं बाइट्स की तुलना में प्रगति की रिपोर्ट करने का एक आसान तरीका नहीं जानता।


यदि आप केवल मेटाडेटा (और फ़ाइलों की वास्तविक सामग्री) की तुलना करके अपनी शांति पा सकते हैं तो आप rsync का उपयोग कर सकते हैं। यह काफी तेज हो जाएगा।

अधिक जानकारी के लिए:


0

मैं डेटा अखंडता की जांच करने के लिए कुछ प्रकार के हैश एप्लिकेशन का उपयोग कर रहा हूं। मुझे पता है कि कई डुप्लिकेट फ़ाइल खोजने वाली उपयोगिताओं डुप्लिकेट / गैर-डुप्लिकेट की पहचान करने के लिए हैश का उपयोग करती हैं। मुझे लगता है कि यह एक जांच है जो सार्थक हो सकती है।


0

आप उसके लिए rdiff- बैकअप का उपयोग कर सकते हैं । इसे दोनों सर्वरों पर स्थापित करें और यह चेकसम की स्मार्ट तुलना करेगा और सिंक करेगा जो अभी तक नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.