diff -r केवल कुछ फ़ाइल प्रकारों के लिए


12

क्या कोई ऐसा तरीका है जिससे मैं दो निर्देशिकाओं के पुनरावर्ती रूप का प्रदर्शन कर सकता हूं, लेकिन केवल (उनके संबंधित स्थानों में) फाइलों की तुलना करें जो एक विशिष्ट फ़ाइल नाम या फ़ाइल का प्रारूप विधेय से मेल खाते हैं?

जैसे मैं कुछ करना चाहूंगा

diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml

... या इससे भी बेहतर:

diff -r dir-a dir-b -filetype text

स्पष्ट रूप से यह उपयोग करने के लिए अनिवार्य नहीं है diffक्योंकि मुझे लगता है कि मैं इसके साथ भटकाव कर सकता हूं findऔर -exec diffयह चाल भी कर सकता हूं (मुझे नहीं पता कि बाद के मामले में पूरक फाइलपैथ कैसे उत्पन्न किया जाए)।


3
पैटर्न से मेल खाने वाली फ़ाइलों को बाहर करने का एक विकल्प है, मुझे केवल पैटर्न से मेल खाने वाली फ़ाइलों को शामिल करने का विकल्प नहीं दिखता है।
बरमार

1
निर्देशिका की तुलना करने के लिए सभी विकल्प विशिष्ट में पाया जा सकता gnu.org/software/diffutils/manual/html_node/...
Barmar

1
इस लिंक को देखें और Sérgio जवाब देखें।
तुहदह

जवाबों:


1

Shellscript differ-r

यह शेलस्क्रिप्ट दो निर्देशिकाओं का एक पुनरावर्ती रूप प्रदर्शन कर सकता है लेकिन केवल (उनके संबंधित स्थानों में) फाइलों की तुलना करता है जो एक विशिष्ट फ़ाइल नाम या फ़ाइल स्वरूप से मेल खाते हैं।

#!/bin/bash

greenvid="\0033[32m"
resetvid="\0033[0m"

if [ $# -ne 3 ]
then
 echo "Usage: compare files in two directories including subdirectories"
 echo "         $0 <source-dir> <target-dir> <pattern>"
 echo "Example: $0  subdir-1     subdir-2     \"*.txt\""
 exit
fi

cmd='for pathname do
        greenvid="\0033[32m"
        resetvid="\0033[0m"
        echo -e "${greenvid}diff \"$pathname\" \"${pathname/'\"$1\"'/'\"$2\"'}\"${resetvid}"
        diff "$pathname" "${pathname/'\"$1\"'/'\"$2\"'}"
    done'
#echo "$cmd"

find "$1" -type f -name "$3" -exec bash -c "$cmd" bash {} +

डेमो

फ़ाइलें:

$ find -type f
./1/ett.txt
./1/two.doc
./1/t r e.txt
./1/sub/only-one.doc
./1/sub/hello.doc
./1/sub/hejsan.doc
./differ-r2
./differ-r1
./differ-r
./2/ett.txt
./2/two.doc
./2/t r e.txt
./2/sub/hello.doc
./2/sub/hejsan.doc

उपयोग:

$ ./differ-r
Usage: compare files in two directories including subdirectories
         ./differ-r <source-dir> <target-dir> <pattern>
Example: ./differ-r  subdir-1     subdir-2     "*.txt"

चल रहा है differ-r:

निष्पादित diffकमांड लाइनें हरे रंग के पाठ और आउटपुट के साथ मुद्रित होती हैं, जब कोई मैच नहीं होता है तो डिफ़ॉल्ट पाठ (निम्नलिखित स्क्रीनशॉट में काले रंग पर सफेद) के साथ मुद्रित किया जाता है।

यहां छवि विवरण दर्ज करें

$ ./differ-r 1 2 "*.doc"
diff "1/two.doc" "2/two.doc"
diff "1/sub/only-one.doc" "2/sub/only-one.doc"
diff: 2/sub/only-one.doc: No such file or directory
diff "1/sub/hello.doc" "2/sub/hello.doc"
2d1
< world
diff "1/sub/hejsan.doc" "2/sub/hejsan.doc"

$ ./differ-r 1 2 "*.txt"
diff "1/ett.txt" "2/ett.txt"
2c2
< stabben
---
> farsan
diff "1/t r e.txt" "2/t r e.txt"
1c1
< t r e
---
> 3
$ 

$ ./differ-r 1 2 "*"
diff "1/ett.txt" "2/ett.txt"
2c2
< stabben
---
> farsan
diff "1/two.doc" "2/two.doc"
diff "1/t r e.txt" "2/t r e.txt"
1c1
< t r e
---
> 3
diff "1/sub/only-one.doc" "2/sub/only-one.doc"
diff: 2/sub/only-one.doc: No such file or directory
diff "1/sub/hello.doc" "2/sub/hello.doc"
2d1
< world
diff "1/sub/hejsan.doc" "2/sub/hejsan.doc"

$ ./differ-r 2 1 "*"
diff "2/ett.txt" "1/ett.txt"
2c2
< farsan
---
> stabben
diff "2/two.doc" "1/two.doc"
diff "2/t r e.txt" "1/t r e.txt"
1c1
< 3
---
> t r e
diff "2/sub/hello.doc" "1/sub/hello.doc"
1a2
> world
diff "2/sub/hejsan.doc" "1/sub/hejsan.doc"

rsync फ़िल्टर के साथ

यदि आपको अंतर का वर्णन करते हुए कोई आउटपुट प्राप्त करने की आवश्यकता नहीं है, तो केवल यह जानें कि कौन सी फाइलें अलग हैं या गायब हैं (ताकि rsyncउन्हें कॉपी करना चाहें), आप निम्न कमांड लाइन का उपयोग कर सकते हैं।

rsync --filter="+ <pattern>" --filter="+ */" --filter="- *"--filter="- */"  -avcn <source directory>/ <target directory>

डेमो

$ rsync --filter="+ *.doc" --filter="+ */" --filter="- *"  -avcn 1/ 2
sending incremental file list
./
sub/
sub/hello.doc
sub/only-one.doc

sent 276 bytes  received 35 bytes  622.00 bytes/sec
total size is 40  speedup is 0.13 (DRY RUN)

sent 360 bytes  received 41 bytes  802.00 bytes/sec
total size is 61  speedup is 0.15 (DRY RUN)
olle@bionic64 /media/multimed-2/test/test0/temp $ rsync --filter="+ *.txt" --filter="+ */" --filter="- *" -avcn 1/ 2
sending incremental file list
./
ett.txt
t r e.txt
sub/

sent 184 bytes  received 29 bytes  426.00 bytes/sec
total size is 21  speedup is 0.10 (DRY RUN)

यदि आप लाइनों और निर्देशिकाओं के बिना टिप्पणी के एक साफ उत्पादन चाहते हैं, तो आप grepइस तरह से उत्पादन कर सकते हैं ,

$ pattern="*.doc"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *"  -avcn 1/ 2 | grep "${pattern/\*/.\*}"
sub/hello.doc
sub/only-one.doc

Shellscript rsync-diff

इस वन-लाइनर को शेलस्क्रिप्ट के मुख्य कमांड में बनाया जा सकता है rsync-diff

#!/bin/bash

LANG=C

if [ $# -ne 3 ]
then
 echo "Usage: compare files in two directories including subdirectories"
 echo "         $0 <source-dir> <target-dir> <pattern>"
 echo "Example: $0  subdir-1     subdir-2     \"*.txt\""
 exit
fi

pattern="$3"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" \
 -avcn "$1"/ "$2" | grep "${pattern//\*/.\*}" | grep -v \
  -e '/$' \
  -e '^sending incremental file list$' \
  -e '^sent.*received.*sec$' \
  -e '^total size is.*speedup.*(DRY RUN)$'

0

चूंकि आपने "स्पष्ट रूप से अंतर का उपयोग करना अनिवार्य नहीं है" का उल्लेख किया है,

आप के लिए यह काम करना चाहिए मिल जाएँगी फ़ाइल प्रकारों की तरह क्या अनदेखी करने के लिए के लिए आसानी से विन्यास:

यहां छवि विवरण दर्ज करें

इसके अलावा एक और विकल्प एक सरल स्क्रिप्ट लिखना होगा जो एक सफेद सूची से एक काली सूची में स्थानांतरित हो जाएगा और बाद में काली सूची को --excludeविकल्प के साथ अंतर पर पारित किया जाएगा ।


'कमांड-लाइन' को जोड़ने के लिए अपडेट किए गए टैग
मार्कस जूनियस ब्रूटस

0

शेल सपोर्ट कमांड कमांड के साथ आप निम्न एक-लाइनर का उपयोग कर सकते हैं (जैसा कि पहले ही @JammingThebBits द्वारा नोट किया गया है):

diff -r dir-a dir-b --exclude-from=<( \
find dir-a dir-b -type f -not \( -name '*.xml'  -or -name '*.java' \) \
| sed 's:^.*/\([^/]*\)$:\1:' \
)

यह इस तरह से काम करता है: findफ़ाइलों के लिए खोज ब्याज की नहीं, sedबेसन निकालने (चल basenameबहुत धीमी है अगर आपके पास कई फाइलें हैं) और उन्हें एक अस्थायी फ़ाइल में डालता है ; इस तरह की फाइल को diffयह बताने के लिए दिया जाता है कि उन्हें तुलना (दोहरे बहिष्करण = समावेश) से बाहर रखा जाए।

यदि आपके पास कमांड प्रतिस्थापन नहीं है, तो sedआउटपुट को एक फ़ाइल में रखें और स्पष्ट रूप से इसे पास करें diff

उदाहरण में मैंने केवल XML और JAVA फ़ाइल के लिए खोज की, उन्हें OR के साथ अलग करके आवश्यकतानुसार परिवर्तित करें।

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