2012-06-18 7 views
9

लिनक्स मिंट 12 में जीनोम का उपयोग करके, मैंने एक एनटीएफएस फ्लैश ड्राइव से दूसरे एनटीएफएस फ्लैश ड्राइव में 9.7 जीबी (सबफ़ोल्डर का एक जटिल पेड़) का एक फ़ोल्डर कॉपी किया। जीनोम के अनुसार फ़ाइल मेल की गणना करती है, लेकिन डु (और अन्य प्रोग्राम्स) के अनुसार बाइट गणना मेल नहीं खाती है। (मुझे अन्य लिनक्स डिस्ट्रोज़ और विंडोज एक्सपी में फ़ोल्डरों की प्रतिलिपि बनाने में एक ही समस्या है।)2 फ़ोल्डरों की तुलना करें और अलग-अलग बाइट गिनती के साथ फाइलें खोजें

मैं केवल यह जानना चाहता हूं कि कौन सी फाइलें बाइट गणना से मेल नहीं खाती हैं। (मैं प्रत्येक फ़ाइल की सामग्री की तुलना नहीं करना चाहता, क्योंकि इससे बहुत लंबा रास्ता तय होगा।) बाइट-गिनती-मेल नहीं खाई गई फ़ाइलों को खोजने का सबसे अच्छा, आसान और सबसे तेज़ तरीका क्या है?

+0

एक-लाइनर समाधान संबंधित यूनिक्स StackExchange सवाल मिला: http://unix.stackexchange.com/q/62140 – tanius

उत्तर

3

सांत्वना आदेशों मान लिया जाये कि आप dir1 और dir 2 की तुलना करने की जरूरत है, यहाँ कर रहे हैं:

cd dir1 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt 
cd dir2 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

आप इसे ठीक से फ़ाइल लंबाई और पथ प्रिंट बनाने के लिए awk मापदंडों को संपादित करने की आवश्यकता हो सकती है।

6

क्या आपने जांच की है कि दोनों विभाजनों में एक ही विशेषता है? (ब्लॉक आकार, आकार, हटाने या खराब ब्लॉक आदि के लिए आरक्षित स्थान)

आपके विशिष्ट मामले के लिए, मैं rsync विकल्प -n (या - ड्रा-रन) के साथ अनुशंसा करता हूं। यह आपको बताएगा कि कौन सी फाइलें अलग हैं। यही कारण है:

$ rsync -I -n /source/ /target/ 

विकल्प मैं बार अनदेखी करने के लिए है। आप दोनों निर्देशिका समकक्ष (टाइमस्टैम्प, अनुमतियां इत्यादि) बनाने के लिए एक ही कमांड का उपयोग कर सकते हैं।

चेक rsync या के मैनुअल विकल्प --help और अधिक विकल्प और यह कैसे उपयोग करने पर उदाहरण प्राप्त करने की कोशिश। यह बहुत शक्तिशाली है।

10

मैं @ user1464130 द्वारा उत्तर को अनुकूलित करता हूं क्योंकि फ़ाइल नामों में रिक्त स्थान को संभालने में समस्या होती है।

cd dir1 
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt 
cd dir2 
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

प्रत्येक फ़ाइल पर एक कमांड का शुभारंभ और रिपोर्ट में परिणाम का उपयोग करना चाहते हैं, तो आप while बैश निर्माण का उपयोग कर सकते हैं। यह उदाहरण प्रत्येक फ़ाइल के लिए चेकसम की गणना करने के लिए md5sum का उपयोग करता है।

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 

प्रत्येक $() अलग से मार डाला और हमें प्रत्येक फ़ाइल के लिए चेकसम गणना करने के लिए अनुमति देता है। tr का उपयोग प्रत्येक लगातार रिक्त स्थान को एक ही स्थान पर निचोड़ता है और cut एन-वें स्थिति में शब्द को पहले स्थान पर निकाल देता है। अगर हम ऐसा नहीं करते हैं, तो हमें फ़ाइल का नाम दो बार मिलता है क्योंकि md5sum इसे वापस स्टडआउट पर देता है।

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

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584 
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413 
+0

कितना मुश्किल यह सूची में प्रत्येक फ़ाइल के लिए चेकसम मुद्रित करने के लिए इस स्क्रिप्ट को समायोजित किया जाएगा ? – mydoghasworms

+0

मैंने समाधान प्रदान करने के लिए अपना उत्तर संपादित किया है। मैंने डिफ को किए बिना चेकसम जोड़ा है। क्या आप चेकसम पर अंतर करना चाहते हैं?यदि यह मामला है तो आपको बाइट गिनती की आवश्यकता नहीं है और यह ओपी प्रश्न से थोड़ा अलग है। इसके अलावा चेकसम बेहतर है अगर हम यह सुनिश्चित करना चाहते हैं कि दोनों फाइलें समान हों या नहीं। हम एक फ़ाइल संशोधन समय – lkuty

+0

ग्नरली भी जोड़ सकते हैं। बहुत धन्यवाद। – mydoghasworms

संबंधित मुद्दे