2011-05-18 8 views
14

मुझे 2 फाइलें मिली हैं। आइए उन्हें md5s1.txt और md5s2.txt पर कॉल करें। दोनों मेंdiff फ़ाइलें प्रत्येक पंक्ति के केवल पहले n वर्णों की तुलना

find -type f -print0 | xargs -0 md5sum | sort > md5s.txt 

विभिन्न निर्देशिकाओं में कमांड का उत्पादन होता है। कई फाइलों का नाम बदल दिया गया था, लेकिन सामग्री वही रही। इसलिए, उनके पास एक ही md5sum होना चाहिए। मैं की तरह

diff md5s1.txt md5s2.txt 

एक diff उत्पन्न करना चाहते हैं, लेकिन यह केवल पहले 32 प्रत्येक पंक्ति के पात्रों, यानी केवल md5sum, नहीं फ़ाइल नाम तुलना करनी चाहिए। समान md5sum वाली रेखाओं को बराबर माना जाना चाहिए। आउटपुट सामान्य diff प्रारूप में होना चाहिए।

उत्तर

14

आसान स्टार्टर:

diff <(cut -d' ' -f1 md5s1.txt) <(cut -d' ' -f1 md5s2.txt) 

इसके अलावा, विचार सिर्फ

diff -EwburqN folder1/ folder2/ 
+1

कर इस उत्तर का विस्तार से स्थापित कर सकते हैं, यदि आप वास्तव में चाहते हैं * एन * अक्षर, कुछ ऐसा: 'diff <(cut -b-80 dump.csv) <(cut -b-80 dump2.csv)' (यहां, 'n' = 80) –

2

केवल md5 <(cut -c -32 md5sums.sort.XXX) पर diff का उपयोग कर कॉलम की तुलना करें, और diff बता जोड़े या निकाले लाइनों की बस लाइन संख्या मुद्रित करने के लिए --old/new-line-format='%dn'$'\n' का उपयोग कर। इसे ed md5sums.sort.XXX में पाइप करें ताकि यह केवल md5sums.sort.XXX फ़ाइल से उन पंक्तियों को प्रिंट करेगा।

diff \ 
    --new-line-format='%dn'$'\n' \ 
    --old-line-format='' \ 
    --unchanged-line-format='' \ 
    <(cut -c -32 md5sums.sort.old) \ 
    <(cut -c -32 md5sums.sort.new) \ 
    | ed md5sums.sort.new \ 
    > files-added 
diff \ 
    --new-line-format='' \ 
    --old-line-format='%dn'$'\n' \ 
    --unchanged-line-format='' \ 
    <(cut -c -32 md5sums.sort.old) \ 
    <(cut -c -32 md5sums.sort.new) \ 
    | ed md5sums.sort.old \ 
    > files-removed 

ed के साथ समस्या यह है कि यह स्मृति में पूरी फ़ाइल, यदि आप चेकसम की एक बहुत कुछ है जो एक समस्या हो सकती लोड होगा है। ed में diff के आउटपुट को पाइप करने के बजाय, इसे निम्न कमांड में पाइप करें, जो बहुत कम मेमोरी का उपयोग करेगा।

diff … | (
    lnum=0; 
    while read lprint; do 
     while [ $lnum -lt $lprint ]; do read line <&3; ((lnum++)); done; 
     echo $line; 
    done 
) 3<md5sums.sort.XXX 
1

आप देख रहे हैं डुप्लिकेट फ़ाइलें के लिए fdupes आपके लिए यह कार्य कर सकते हैं:

$ fdupes --recurse 

ubuntu पर आप यह

$ apt-get install fdupes 
संबंधित मुद्दे