मैं जल्दी से दो निर्देशिकाओं की तुलना कैसे कर सकता हूं जो कि कड़ी से जुड़ी फाइलों को छोड़ देती है जो कि दोनों निर्देशिकाओं में मौजूद हैं


1

मेरे पास दो निर्देशिकाएं हैं जिनकी मैं तुलना करना चाहूंगा। पहली निर्देशिका में कई हजारों फ़ोल्डरों और फ़ाइलों का एक rsync बैकअप है। दूसरी डायरेक्टरी में पहले की सभी फाइलों के हार्ड लिंक हैं, साथ ही कुछ अतिरिक्त फोल्डर और फाइलें हैं। मैं निर्देशिकाओं की तुलना इस तरह से करने में सक्षम होना चाहता हूं कि हार्डलिंक की गई फाइलें छोड़ दी जाती हैं या कम से कम जल्दी से एक ही फाइल बनने का फैसला किया जाता है और केवल वे फाइलें जो हार्डलिंक नहीं हैं, उनकी तुलना की जाती है। क्या यह कुछ अलग कर सकता है, या कोई बेहतर तरीका है?

जवाबों:


1

cmpdir इस समस्या के लिए है (अस्वीकरण - मैंने इसे लिखा था)।

यह केवल इनोड की तुलना करता है। फ़ाइलें जो केवल पहली निर्देशिका में मौजूद हैं उन्हें "हटाए गए" के रूप में चिह्नित किया गया है, जबकि फाइलें जो केवल दूसरी निर्देशिका में "नई" के रूप में मौजूद हैं। यह फ़ाइल सामग्री की तुलना नहीं करता है।


0
  1. आप अपनी फ़ाइलों के आयतों ls -i -1(-1 / "एक" आउटपुट के लिए प्रति फ़ाइल एक पंक्ति लिखते हैं) दिखा सकते हैं।

  2. प्रत्येक दो फ़ोल्डरों के लिए आउटपुट सहेजें।

  3. यदि "मूल" और हार्डलिंक फ़ाइल का फ़ाइल नाम अलग है, cut -f1तो फ़ाइल नाम को फ़िल्टर करने के लिए उपयोग करें और केवल इनोड संख्या को बनाए रखें।

  4. इनकोड संख्या का उपयोग करके फ़ाइलों को सॉर्ट करें sort। अब आप diffअंतर देखने के लिए उपयोग कर सकते हैं ।

  5. केवल पहले फोल्डर में होने वाली => इनोड्स से grep "^<" diffOutput.listशुरू <होने वाली लाइनों के लिए फिल्टर का उपयोग करें । यदि आप इनोड संख्या की आवश्यकता है, तो आउटपुट से पहले वर्ण ( या ) को हटाने के grep "^>"लिए फोल्डर बी का उपयोग करें ।cut -c2-<>


यदि आपने पहले फाइल में से फाइलनेम हटा दिए हैं, तो आपको दिए गए इनकोड नंबर के लिए फाइलनेम को खोजना होगा।

ls -l -1एक फ़ाइल में प्रत्येक फ़ोल्डर के लिए (फ़ाइल नाम के साथ) का आउटपुट सहेजें । अब आप grepबैश लूप में दिए गए इनकोड नंबरों के लिए फाइलनाम प्राप्त करने के लिए उपयोग कर सकते हैं :

आज्ञा देना InodesFilenamesA.listफ़ाइल जिसमें इनकोड संख्या और फ़ाइल नाम Folder A हो

12345 file1inBothFolders
99999 file2OnlyInFolderA
88888 file3OnlyInFolderA
...

आज्ञा inodesA.listदेना एक फ़ाइल जिसमें केवल फोल्डर ए में होने वाले इनोड्स हों

99999
88888
....

अब लूप ओवर inodesA.list

cat inodesA.list | while read line; do
    grep "$line" InodesFilenamesA.list
done

आपको फ़ोल्डर की एक सूची मिलती है

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