मैं 'diff -X' कैसे विशिष्ट पथों को अनदेखा कर सकता हूं और नाम नहीं दर्ज कर सकता हूं?


29

करते हुए: diff -r -X <ignore-list> <src-dir> <dest-dir>

लगता है कि अगर वे फॉर्म के हैं तो diffइग्नोर एंट्री नहीं <ignore-list>करते <dir>/<file>

फार्म के प्रवेश <file> पर विचार किया जाता है। यह एक समस्या है क्योंकि मेरे पास <file>विभिन्न उप-निर्देशिकाओं में नामित कई फाइलें हो सकती हैं , जिनमें से कुछ को मैं अनदेखा नहीं करना चाहता।

diffया तो मेन्यू में पैटर्न सिंटैक्स के बारे में ज्यादा जानकारी नहीं है । मैं जो बता सकता हूं, वह केवल एक फ़ाइल का आधार-नाम है जिसे अंतर माना जाता है ( यदि आप रुचि रखते हैं तो http://forums.gentoo.org/viewtopic-t-889788-start-0.html देखें )।


आदमी, diffका --excludeविकल्प बहुत ही
चमकदार है

जवाबों:


30

लिस्टिंग निर्देशिका काम करना चाहिए; उदाहरण के लिए, यहाँ मैंने एक स्क्रिप्ट में क्या प्रयोग किया है (मान लें कि विष्णु भिन्न है),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... जो .svnऔर .gitdirs की सामग्री को नजरअंदाज करता है , लेकिन यह भी नाम *.zip/ *.gz/ आदि व्यक्तिगत फ़ाइलों ।

संपादित करें: प्रपत्र के पथों को फ़िल्टर करने के लिए, dir_a/file1लेकिन फिर भी diffएक ही बेसनेम वाली फाइलें, जैसे कि dir_b/file1या dir_a/b/file1, फिर फ़ाइलों की एक सूची diffतैयार करनी होगी (उदाहरण के लिए, उपयोग करना find), और इन रास्तों से प्राप्त की गई तुलना करने के लिए फाइल; जैसे, दिया

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

आप उदाहरण के लिए, */a/2.txtलेकिन अभी भी नाम की अन्य फ़ाइलों की तुलना करने के लिए तुलना करने के लिए फ़ाइलों की सूची उत्पन्न करते हैं 2.txt। सिवाय सभी फाइलों को " ONE/a/2.txtखोजे " (एक regexp का उपयोग यहाँ भी किया जा सकता है, जैसे .*/a/2.txt)

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

जो प्रभाव में ONE/a/2.txt(और TWO/a/2.txt) को अनदेखा करता है , लेकिन फिर भी नामित अन्य फ़ाइलों की तुलना करता है 2.txt:

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

संपादित करें: या, findपाठक के लिए एक व्यायाम के रूप में अतिरिक्त मज़ा (अतिरिक्त मज़ा छोड़ दिया), फ़ाइलों और निर्देशिकाओं को बाहर करने के लिए और फिर diffसब कुछ का चयन करें:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

उपरोक्त उदाहरण विशिष्ट फ़ाइल "{top} /a/2.txt", "b" नामक किसी भी निर्देशिका को बाहर करता है, और बाकी सब कुछ अलग होगा। (सरल " -name b" के बजाय आप " -regex '.*/b'" - नोट, नो ट्रेलिंग "/" का भी उपयोग कर सकते हैं ।)


2
धन्यवाद, लेकिन मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। वहाँ केवल समर्थन तब प्रतीत होता है जब आप 'आधार-नाम' का उपयोग करते हैं। यह एक निर्देशिका या एक फ़ाइल का नाम हो सकता है। या तो मामले में, आपने जो पूछा है, उसकी उपेक्षा करें। समस्या तब पैदा होती है जब आप रास्तों का उपयोग करते हैं। उदाहरण के लिए, मैं / a / निरपेक्ष / पथ / से / a / फ़ाइल या ./a/relative/path/to/a/file को अनदेखा करने के लिए भिन्न नहीं हो सकता।
ऐश

2
diff --exclude = "/ this / specific / file / that / im / स्पष्ट रूप से / विनती / आप / को अनदेखा करना"। यह काम नहीं करेगा।
ऐश

3
सही, excludeपैटर्न फाइल के बेसन (जैसे gnu.org/software/diffutils/manual/html_node/… ) के विरुद्ध मेल खाते हैं ; पथ (के रूप में foo/bar.txt) काम नहीं करेगा । ऐसा करने के लिए, आपको findफ़ाइल नाम की सूची तैयार करने के लिए दौड़ना होगा , और तुलना करने के लिए फ़ाइल का पथ प्राप्त करना होगा।
माइकल

अद्यतन उत्तर को शामिल करने के लिए फ़ाइल पथों को छोड़कर diff, केवल उपयोग करने के बजायbasename
michael

ठीक है, मैं देख रहा हूँ कि आप क्या प्रस्ताव दे रहे हैं लेकिन एक समस्या प्रतीत होती है। मुझे निर्देशिका के रूप में अच्छी तरह से विचार करने की आवश्यकता है, न कि केवल फाइलें (यानी -type f)। अब, जब आप अभी भी regexp का उपयोग करके कुछ फ़ाइलों को prune कर सकते हैं find, यदि इनपुट diffमें निर्देशिका है, तो यह उस निर्देशिका के भीतर फ़ाइलों की तुलना करेगा और इनमें से कुछ फ़ाइलों को अनदेखा करने की आवश्यकता हो सकती है .... इसलिए आप कर रहे हैं वापस वर्ग 1 के लिए
ऐश

2

मैं एक ही समस्या थी तो मैं एक पैच बनाया diff। पैच को अभी तक स्वीकार नहीं किया गया है, लेकिन आप diffपैच के साथ अपना संस्करण बना सकते हैं या आर्क पैकेज के साथ आर्क लिनक्स पर स्थापित कर सकते हैं ।

यहाँ है diffपैच।


1

निर्देशिका को बाहर करने के लिए directory/sub-directory, मैं उपयोग करता हूं

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

हालाँकि, हालांकि इसे एक एकल बहिष्कृत के लिए काम करना चाहिए, लेकिन यह एक लंबी अनदेखी सूची के लिए संभव नहीं होना चाहिए जैसा कि आपके पास है।


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

1
हालांकि यह प्रश्न का उत्तर दे सकता है, यह एक बेहतर उत्तर होगा यदि आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि ऐसा क्यों होता है।
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.