लिस्टिंग निर्देशिका काम करना चाहिए; उदाहरण के लिए, यहाँ मैंने एक स्क्रिप्ट में क्या प्रयोग किया है (मान लें कि विष्णु भिन्न है),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... जो .svn
और .git
dirs की सामग्री को नजरअंदाज करता है , लेकिन यह भी नाम *.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'
" - नोट, नो ट्रेलिंग "/" का भी उपयोग कर सकते हैं ।)
diff
का--exclude
विकल्प बहुत ही