दो निर्देशिका पेड़ों को देखते हुए, मैं यह कैसे पता लगा सकता हूं कि कौन सी फाइलें सामग्री से भिन्न हैं?


786

यदि मैं दो निर्देशिका पेड़ों के बीच अंतर खोजना चाहता हूं, तो मैं आमतौर पर निष्पादित करता हूं:

diff -r dir1/ dir2/

यह ठीक वैसा ही आउटपुट करता है जैसा कि संबंधित फाइलों में अंतर होता है। मैं केवल उन संगत फ़ाइलों की सूची प्राप्त करने में रुचि रखता हूं जिनकी सामग्री अलग है। मैंने मान लिया कि यह केवल कमांड लाइन विकल्प पास करने की बात होगी diff, लेकिन मुझे मैन पेज पर कुछ भी नहीं मिला।

कोई सुझाव?



1
निर्देशिकाओं में से एक के संबंध में, केवल उन फ़ाइलों / निर्देशिकाओं को कैसे प्राप्त करें जो अन्य में अतिरिक्त हैं?
संदीपन नाथ

dircmpयूनिक्स पर कमांड का उपयोग करें (लिनक्स नहीं)
21

जवाबों:


1118

आपने कहा कि लिनक्स, इसलिए आप किस्मत से बाहर हैं (कम से कम यह उपलब्ध होना चाहिए, जब यह जोड़ा गया तो निश्चित नहीं):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

आपको जो चाहिए वो करना चाहिए।

यदि आप ऐसी फ़ाइलों के लिए अंतर देखना चाहते हैं जो या तो निर्देशिका में मौजूद नहीं हैं:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options

12
अच्छा लगा। लेकिन छोटा है diff -qr dir1/ dir2/और मेरे विस्तारित संस्करणdiff -qr dir1/ dir2/ | grep ' differ'
sobi3ch

1
@ क्यों यह उत्तर के रूप में एक ही कमांड है। मैंने इसे केवल --briefशॉर्टकट में बदल दिया है -q
sobi3ch

2
@skv ने वास्तव में मूल प्रश्न क्या नहीं पूछा, लेकिन इस प्रश्न को भी समायोजित करने के लिए उत्तर को अपडेट किया।
मार्क लोसर

3
@ मायकेमैक्सवेल इसे होना चाहिए --brief-briefके रूप में व्याख्या की जाती है -b -r -i -e -f, दूसरे शब्दों में झंडे के एक सेट के रूप में एक विकल्प के रूप में नहीं।
डोबॉस

2
@daboross: वाह, मैं समय के लिए यूनिक्स / लिनक्स का उपयोग कर रहा हूं, और मुझे कभी भी यह एहसास नहीं हुआ कि '-' और '-' के बीच अंतर था। (मुझे नहीं लगता '-' शुरू होने पर अस्तित्व में था।) स्पष्टीकरण के लिए धन्यवाद!
माइक मैक्सवेल

287

मेरे द्वारा उपयोग की जाने वाली कमांड है:

diff -qr dir1/ dir2/

यह ठीक वैसा ही है जैसा मार्क का :) लेकिन उसके जवाब ने मुझे परेशान कर दिया क्योंकि यह विभिन्न प्रकार के झंडे का उपयोग करता है , और इसने मुझे दो बार देखा। मार्क के अधिक वर्बोज़ झंडे का उपयोग करना यह होगा:

diff  --brief --recursive dir1/ dir2/

जब दूसरा जवाब पूरी तरह स्वीकार्य हो तो मैं पोस्ट करने के लिए माफी चाहता हूं। खुद को रोक नहीं सका ... कम पांडित्यपूर्ण होने पर काम करना।


3
पूरी तरह से संगति की सराहना करते हैं - लेकिन बुरा मत मानो; मैंने मार्क के उत्तर को भी
उखाड़ फेंका है

10
..तो क्या यह समझ में आता है कि जू ने एक अलग स्वाद के साथ अलग-अलग उत्तर दिए हैं? IMHO नहीं! क्या यह समझ में आता है कि दोनों ने एक सुसंगत उत्तर के लिए दोनों उत्तरों को मिला दिया है? हाँ! ;)
sobi3ch

1
सिर्फ एक प्रश्न; किस लिए qखड़ा है? क्या यह किसी चीज़ का संक्षिप्त नाम है? मैं किसी भी तर्क के पीछे नहीं मिल सकता q..
kramer65

3
@ kramer65 - यह "- दुख" के समान है, लेकिन मुझे लगता है कि आपको आश्चर्य है कि क्यू? शायद जल्दी के लिए? "-बी" मैन पेज के अनुसार "सफेद स्थान की मात्रा में परिवर्तन की उपेक्षा" द्वारा लिया जाता है।
FPC

3
@ kramer65 मेरा मानना ​​है कि qयह quietआम तौर पर कम क्रिया है ।
गोगेटा70

105

मैं उपयोग करना पसंद करता हूं git diff --no-index dir1/ dir2/, क्योंकि यह रंग में अंतर दिखा सकता है (यदि आपके पास आपके गिट कॉन्फ़िगरेशन में वह विकल्प सेट है) और क्योंकि यह "कम" का उपयोग करते हुए एक लंबे समय के पृष्ठांकित आउटपुट में सभी अंतर दिखाता है।


25
साफ। किसने अनुमान लगाया होगा कि गिट अपनी फाइलों के खिलाफ रेपो नहीं, बल्कि मनमानी निर्देशिकाओं को अलग कर सकते हैं?
डैन डैस्कलेस्क्यू

2
पर्ल स्क्रिप्ट कोऑर्डिफ़ यहां बहुत उपयोगी है, इसका उपयोग svn और सामान्य अंतर के साथ किया जा सकता है।
फेलिप अल्वारेज़

4
यदि आप (मेरे जैसे) 2 dirs को अलग git प्रोजेक्ट्स / रेपो के रूप में तुलना करते हैं तो आपको stackoverflow.com/a/1792477/473390--no-index पर अधिक जोड़ने की आवश्यकता है । मैंने @ alan-porter उत्तर अपडेट किया है।
sobi3ch 13

मुझे यह पसंद है, मुझे यह भी पता चलता है कि यदि आप --name-status कमांड लाइन में जोड़ते हैं , तो यह फ़ाइल नाम सूची को "M / A / D" झंडे के साथ संशोधित / जोड़ा / हटाए गए स्थिति के लिए दिखाएगा।
gzh

ऐसा होता है कि दोनों निर्देशिका वास्तव में .it फ़ोल्डर युक्त हैं, मैं इसे तुलना से कैसे बाहर कर सकता हूं?
मुहम्मद साइक

35

ये दो आदेश मूल रूप से इस चीज के लिए पूछे जाते हैं:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

उनके बीच चुनाव dir1 और dir2 के स्थान पर निर्भर करता है:

जब निर्देशिका दो अलग ड्राइव पर रहते हैं, तो outperforms rsync को अलग करें। लेकिन जब दो निर्देशिकाओं की तुलना एक ही ड्राइव पर होती है, तो rsync तेज होता है। इसका कारण यह है कि दोनों ड्राइवों पर भार को समान रूप से दोनों निर्देशिकाओं में लगभग बराबर लोड किया जाता है।

rsync वास्तव में उनकी तुलना करने से पहले बड़ी मात्रा में चेकसमों की गणना करता है। वह समूह बड़ी मात्रा में i / o संचालन का समूह बनाता है और जब एक ही ड्राइव पर चीजें होती हैं तो अधिक कुशल प्रसंस्करण होता है।


3
rsync न केवल एकल ड्राइव पर फ़ाइलों के लिए तेज़ है, बल्कि उप-विभाजनों में फ़ाइलों की तुलना करने की भी अनुमति देता है, उदाहरण के लिए rsync --options /usr /bin /var /sbin /lib /old_rootप्रभावी रूप से वर्तमान रूट /(इसमें सभी उप-विभाजनों को निर्दिष्ट करके) की तुलना करेगा और /old_root(उदाहरण के लिए कुछ पुराने बैकअप सहित /), जो कुछ diff -rहो सकता है 'करते हैं। और अगर आप मानते हैं कि एक ही आकार, अनुमतियाँ और टाइमस्टैम्प वाली फाइलें शायद नहीं बदली हैं, तो बाहर निकलने --checksumसे आपको बहुत तेजी से (यदि ऐसा नहीं है) चेक प्रदान किया जाएगा कि कौन सी फाइलें बदल गई हैं।
मतिजा नलिस

1
का उद्देश्य क्या है --deleteके साथ rsync?
टॉम हेल

2
--Delete का उद्देश्य गंतव्य-dir में मौजूदा फ़ाइलों को हटाना है जो (dir) स्रोत dir में मौजूद नहीं हैं
थॉमस मंक

2
इस मामले में ( --dry-runध्वज के साथ ) कुछ भी वास्तव में नष्ट नहीं किया गया है, rsyncकेवल प्रिंट जो फाइल dir1 में हैं, लेकिन dir2 में नहीं
माता

11
मैं --dry-runसबसे पहले हमेशा गलती से इसे न भूलने की सलाह दूंगा ।
डेव रैगर

22

Meld भी दो निर्देशिकाओं की तुलना करने के लिए एक महान उपकरण है:

meld dir1/ dir2/

फाइलों या निर्देशिकाओं की तुलना करने के लिए मेल्ड के पास कई विकल्प हैं। यदि दो फाइलें भिन्न होती हैं, तो फ़ाइल तुलना मोड में प्रवेश करना और सटीक अंतर देखना आसान है।


2
अच्छा लगा। मैंने पेड़ों पर तुलना करने के लिए एक सरल पर्ल स्क्रिप्ट लिखी है, लेकिन मैं सीमाओं को मार रहा हूं। इससे टिकट लगता है।
डेविड टोनहोफर

एकमात्र समस्या यह है कि यह स्क्रिप्टिंग के लिए खुद को उधार नहीं देता है क्योंकि यह एक ग्राफिकल ऐप है। लेकिन यह अच्छा है अगर आप GUI को बुरा नहीं मानते हैं! धन्यवाद।
डीनएम

मुझे लगता है कि meldअगर बड़ी निर्देशिकाओं पर इस्तेमाल किया जाता है, तो यह बहुत ही सुस्त हो जाता है। क्या कुछ ऐसा है जो बड़ी निर्देशिकाओं को बेहतर तरीके से संभालता है?
पॉपअप

@Pupup, नहीं कि मुझे पता है। आप इस तरह के साथ कुछ अलग फ़ाइल नाम पा सकते हैं, हालांकि:find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
अलेक्जेंडर

1
@Alexander - उस मामले में मुझे लगता है कि meld <(find dir1 -ls ) <(find dir2 -ls)बहुत अच्छी तरह से काम करता है, bash प्रक्रिया प्रतिस्थापन का उपयोग कर। (zsh का =(command)काम और भी अच्छा है।)
पॉपअप

10

चैनल हमवतन 'बिलिंग्स' (freenode / # centos प्रसिद्धि के) ने मेरे साथ अपना तरीका साझा किया:

diff -Naur dir1/ dir2

अंतिम निर्देशिका अग्रेषित स्लैश सहित कोई फर्क नहीं पड़ता।

इसके अलावा, यह प्रकट होता है -u विकल्प भिन्न के कुछ पुराने / सर्वर संस्करणों पर उपलब्ध नहीं है।

अंतर में अंतर:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ

2
तो यह वह जगह है --new-file/-Nजो लापता फ़ाइलों को खाली मानती है और --text/-aजिसके कारण सभी बाइनरी इनपुट को पाठ माना जाता है। मैं इस विशेष उपयोग के मामले के लिए अपसाइड नहीं देखता हूं।
21:39

4

डिफस्कोप एक बेहतरीन कमांड लाइन आधारित डायरेक्टरी डिफरेंट टूल है।

मैं विशेष रूप से इसके बारे में पसंद करता हूं कि यह फाइलों में अलग हो सकता है:

यह कई प्रकार के अभिलेखागार को पुनर्संगठित करेगा और उनकी तुलना करने के लिए विभिन्न द्विआधारी स्वरूपों को अधिक मानव पठनीय रूप में परिवर्तित करेगा। यह दो टारबॉल, आईएसओ इमेज या पीडीएफ की तुलना आसानी से कर सकता है।

यह न केवल आपको बताएगा कि कौन सी फाइलें अलग हैं, बल्कि यह भी कि वे कैसे भिन्न हैं।


4

इस आदेश का उपयोग करने के लिए:

diff -qr dir1/ dir2/

-r अलग हो जाएगा सभी उपनिर्देशिका भी -q बताता है कि केवल रिपोर्ट करने के लिए फ़ाइलें अलग हैं।

diff  --brief dir1/ dir2/

- दु: ख उन फ़ाइलों को दिखाएगा जो डॉसेंट निर्देशिका में मौजूद हैं।

वरना

हम Meld का उपयोग कर सकते हैं, जो ग्राफिकल विंडो में अंतर खोजने के लिए आसान दिखाएगा।

meld  dir1/ dir2/

2
--briefऔर -qएक ही विकल्प हैं आपका कथन यह ध्वनि देता है जैसे वे भिन्न हैं लेकिन वे नहीं हैं।
एलिजा लिन

2

आप कर सकते हैं भी उपयोग करें Rsyncऔर find। के लिए find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

लेकिन एक ही नाम और एक ही सबफ़ोल्डर्स में, लेकिन अलग-अलग सामग्री के साथ, फ़ाइलों को सूचियों में नहीं दिखाया जाएगा।

आप जीयूआई के एक प्रशंसक रहे हैं, तो आप जाँच कर सकते हैं मिलकर एक हो जाना है कि @Alexander उल्लेख किया है। यह विंडो और लाइनक्स दोनों में ठीक काम करता है।


1

डीआईआरए और डीआईआरबी के बीच अंतर की रिपोर्ट करने के लिए, अद्यतन / सिंक करते समय भी।

rsync -auv <dirA> <dirB>

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