निर्देशिकाओं में कई फाइलें कैसे अलग करें?


19

मैं diffएक निर्देशिका की दो प्रतियों में एक ही नाम की सभी फ़ाइलों के बीच खोजने की कोशिश कर रहा हूं (एक काम और बैकअप कहो)। उदाहरण के लिए, मैं diffदोनों में एक ही नाम की दो फाइलें रख सकता हूं :

> diff d1/f.cpp d2/f.cpp

या मुझे निर्देशिकाओं में अंतर मिल सकता है:

> diff d1 d2

लेकिन मैं *.cppकेवल फाइलों के बीच अंतर कैसे पा सकता हूं ?

> diff d1/*.cpp d2/*.cpp

काम करने के लिए प्रतीत नहीं होता है (स्पष्ट कारणों के लिए)।

[छोरों के साथ हल करना आसान है, लेकिन मैं एक और सुंदर तरीका खोजने की कोशिश कर रहा हूं]

जवाबों:


13

आप एक शेल लूप का उपयोग कर सकते हैं जो प्रत्येक फ़ाइल के लिए अलग-अलग चलता है, हालांकि यह उन मामलों को नहीं पकड़ेगा जहां d2 में एक फ़ाइल होती है, लेकिन d1 नहीं। हालांकि यह पर्याप्त हो सकता है।

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

या सभी एक लाइन पर:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

${file##*/}भाग एक विशेष पैरामीटर विस्तार है।

फ़ाइल चर मौजूद होता है तो d1/hello.cpp, तो "${file##*/}"करने के लिए विस्तार होगा hello.cpp(फ़ाइल का मूल्य है, लेकिन करने के लिए सब कुछ हुआ था और इसमें पिछले / हटाया के साथ)।

तो "d2/${file##*/}"इस प्रकार परिणाम होगा d2/hello.cppऔर परिणामी कमांड इस प्रकार हैdiff d1/hello.cpp d2/hello.cpp

बैश में स्ट्रिंग जोड़तोड़ पर अधिक जानकारी के लिए http://mywiki.wooledge.org/BashFAQ/100 देखें ।

एक साइड नोट पर, एक वर्जन कंट्रोल सिस्टम (जैसे कि तोड़फोड़, गिट, मर्क्यूरियल आदि ...) इस प्रकार के फैलाने को बहुत आसान बना देगा।


मुझे लगता है कि दो महान जवाबों में, यह तब अधिक सीधे होता है जब कई फ़ाइल प्रकार होते हैं (हालांकि मैंने इस प्रश्न में उल्लेख किया है कि मैं एक बिना लूप समाधान के लिए देख रहा हूं), इसलिए मैंने इसे स्वीकार कर लिया। जोड़ा गया एक जोड़ कमांड से echo "${file##*/}";पहले है diff, इसलिए कोई जानता है कि वास्तव में किन फाइलों की तुलना की जा रही है। इसके अलावा, जैसा कि @ रिनविंड के उत्तर में उल्लेख किया गया है, यह विधि इस मामले को कवर नहीं करती है कि फ़ाइल सूची दोनों निर्देशिकाओं में बिल्कुल समान नहीं है।
ysap

52

diff -qr {DIR1} {DIR2} दोनों निर्देशिकाओं में सभी फाइलें करता है।

  • q केवल अंतर दिखाता है
  • rपुनरावर्ती करता है। जरूरत न होने पर इसे छोड़ दें

आप diffसीधे वाइल्डकार्ड का उपयोग करने के लिए नहीं कह सकते लेकिन आप जोड़ सकते हैं:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

फ़ाइलों को बाहर करने के लिए। इसलिए यदि आप केवल *.cppसबसे आसान तरीका चाहते हैं , तो टेक्स्टफाइल बनाना है जो उन सभी फाइलों को सूचीबद्ध करता है जो नहीं हैं *.cpp। आप इसे निम्न आदेश के साथ कर सकते हैं: ls -I "*.cpp" > excluded_filesजहां -I "*.cpp"तर्क .cpp फ़ाइलों को अनदेखा करता है। ध्यान दें कि उद्धरण चिह्न आवश्यक हैं।


सरल, और निर्दोष रूप से काम करता है।
जोस गोमेज़

4

प्रश्न पूछने के कुछ समय बाद, मुझे पता चला कि meldउपयोगिता कितनी है और तब से मैं इसका उपयोग कर रहा हूं। यह GUI आधारित कार्यक्रम का एक बड़ा हिस्सा है जो फाइलों और निर्देशिका के बीच तुलना और विलय को बहुत आसान काम बनाता है। यह दो या तीन तरह की तुलना करता है।

विशेष रूप से, यह मेरे मूल प्रश्न का उत्तर देता है कि यह आपको निर्देशिका सामग्री की रंग-कोडित तुलना दिखाता है, और आपको फ़ाइल नाम पर डबल-क्लिक करके विशिष्ट फ़ाइलों की तुलना करने देता है।

यदि किसी को तीन-तरफ़ा तुलना की आवश्यकता है, तो gvimdiff( vimसंपादक पर आधारित ) एक महान भी है और साथ ही यह कार्यक्षमता प्रदान करता है।


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