आप केवल एक विशिष्ट प्रकार की फ़ाइलों के लिए एक निर्देशिका कैसे अलग करते हैं?


87

मेरे पास एक अलग कमांड के बारे में एक प्रश्न है यदि मैं एक पुनरावर्ती निर्देशिका को अलग करना चाहता हूं, लेकिन केवल एक विशिष्ट फ़ाइल प्रकार के लिए, ऐसा कैसे करें?

मैंने बहिष्कृत विकल्प का उपयोग करने की कोशिश की, लेकिन केवल एक पैटर्न का ही उपयोग कर सकते हैं:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

आदेश मैं केवल बाहर कर सकते हैं एक्सएमएल फ़ाइल प्रकार के साथ, भले ही वहाँ फ़ोल्डर छवि प्रकार (में फ़ाइलें हैं png, gif, jpg), txt, php, आदि

केवल कुछ फ़ाइल प्रकारों को कैसे अलग किया जाए।



तो क्या आप विशिष्ट प्रकार की फ़ाइलों को अलग करने या उन फ़ाइलों को अलग करने से बाहर करने की कोशिश कर रहे हैं? सवाल वर्णन को संबद्ध करता है नहीं करता है ..
डीईएफ़

जवाबों:


97

आप -xएक से अधिक बार निर्दिष्ट कर सकते हैं ।

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2

info diff(मेरे सिस्टम पर, मुझे क्या करना है info -f /usr/share/info/diff.info.gz) की तुलना करने वाले निर्देशिकाएँ अनुभाग से :

निर्देशिकाओं की तुलना करते समय कुछ फ़ाइलों को अनदेखा करने के लिए, '-x PATTERN' या '--exclude = PATTERN' विकल्प का उपयोग करें। यह विकल्प किसी भी फ़ाइल या उपनिर्देशिका को अनदेखा करता है जिसका आधार नाम शेल पैटर्न PATTERN से मेल खाता है। शेल के विपरीत, फ़ाइल नाम के आधार की शुरुआत में एक अवधि एक पैटर्न की शुरुआत में वाइल्डकार्ड से मेल खाती है। आपको PATTERN को उद्धरणों में संलग्न करना चाहिए ताकि शेल इसे विस्तारित न करें। उदाहरण के लिए, विकल्प -x '*। [Ao]' किसी भी फ़ाइल को अनदेखा करता है जिसका नाम '.a' या '.o' के साथ समाप्त होता है।

यदि आप इसे एक से अधिक बार निर्दिष्ट करते हैं, तो यह विकल्प जम जाता है। उदाहरण के लिए, विकल्प -x 'RCS' -x '* का उपयोग करते हुए , v' किसी भी फ़ाइल या उपनिर्देशिका को अनदेखा करता है जिसका आधार नाम 'RCS' है या ', v' के साथ समाप्त होता है।


मेरा (ubuntu 10.04) के पास ये लाइनें नहीं हैं। मैंने भी कोशिश की है और यह काम नहीं किया। मुझे लगता है कि यह एक नया संस्करण है।
अलुमी

22

मैन पेज से लिया गया (एक संस्करण):

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

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

इसलिए ऐसा लगता है -xकि आप रिपोर्ट करते समय केवल एक पैटर्न को स्वीकार करते हैं लेकिन यदि आप किसी फ़ाइल में सभी पैटर्न को छोड़ना चाहते हैं (संभवतः एक प्रति पंक्ति) तो आप दूसरे ध्वज का उपयोग कर सकते हैं:

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats

जहां बाहर रखा गया है:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

4
आप निम्न कमांड लाइन के साथ <my-ext> एक्सटेंशन को छोड़कर अपने फ़ोल्डर के भीतर सभी फ़ाइल एक्सटेंशन पा सकते हैं:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
जॉन

काश, मैंने जॉन की टिप्पणी को पहले देखा होता, लेकिन macOs / बैश पर मैं एक समान समाधान के लिए कई पैटर्न के साथ अपवर्जन फ़ाइल का उत्पादन करने के लिए आया था: find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILEमैं विश्वास करना चाहता हूं कि मदद करता है, शायद लिनक्स पर भी। (इस उदाहरण में एकल-name "*.[ch]" ठीक है, लेकिन यह बहुत उदाहरण नहीं है)
eruve

16

तुम भी कॉल करने के लिए उपयोग कर सकते हैं -ecec कॉल करने के लिए अंतर:

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

7

एक पूरक की कमी - किं ...।

हम एक वर्कअराउंड कर सकते हैं, सभी फ़ाइलों के साथ एक बहिष्कृत फ़ाइल लेकिन हम जो चाहते हैं उसमें शामिल हैं। इसलिए हम file1एक ऐसी सभी फाइलों को बनाते हैं जिनमें ऐसे एक्सटेंशन नहीं होते हैं जिन्हें हम चाहते हैं, sedजिसमें फ़ाइल नाम को शामिल करना और बस:

diff --exclude-from=file1  PATH1/ PATH2/

उदाहरण के लिए:

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 

सुपर उपयोगी वन-लाइनर, thx। मैक OSX पर grep थोड़ा अलग है और यह बन जाता है find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
mmacvicar

3

मैंने निम्न कमांड का इस्तेमाल किया और उसके *.tmplबीच की सभी फाइलों के अंतर का पता लगाने के लिए । मेरे मामले में यह किसी भी झूठी सकारात्मक उपज नहीं था, लेकिन यह आपके लिए, आपके DIRS की सामग्री पर निर्भर करता है।DIR1DIR2

diff --brief DIR1 DIR2 | grep tmpl


2

यदि आपको यह सुविधाजनक लगता है, तो आप निम्नलिखित का उपयोग कर सकते हैं Makefile। बस चलाएं: "पैच करें"

#Makefile for patches

#Exlude following file endings
SUFFIX += o
SUFFIX += so
SUFFIX += exe
SUFFIX += pdf
SUFFIX += swp

#Exlude following folders
FOLDER += bin
FOLDER += lib
FOLDER += Image
FOLDER += models

OPTIONS = Naur

patch: 
    rm test.patch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
        org/ new/ > test.patch  

unpatch: 
    rm test.unpatch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
    new/ org/ > test.unpatch

1

एक पूरक - किंकर्तव्यविमूढ़ता की कमी के कारण इस तरह के आक्षेपित अनुमानवादी पैटर्न का उपयोग करना आवश्यक हो जाता है

*.[A-Zb-ik-uw-z]*

(ज्यादातर) जावा फ़ाइलों को खोजने के लिए!


1

यदि आप स्रोतों को अलग करना चाहते हैं और इसे सरल रखना चाहते हैं:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

यदि आप केवल एक पथ में मौजूद फ़ाइलों को प्राप्त करना चाहते हैं, तो अंतिम grep निकालें।


0

जब तक यह diffअन्य फ़ाइलों के वास्तविक से बचने नहीं करता है , यदि आपका लक्ष्य पैच फ़ाइल का उत्पादन करना है, या इसी तरह के आप पैकेज filterdiffसे उपयोग कर सकते हैं patchutils, उदाहरण के लिए केवल अपने .pyपरिवर्तनों को पैच करने के लिए :

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.