कैसे करें और दो निर्देशिकाओं को कैसे मिलाएं?


38

मुझे पता है कि विम की विधा ( vimdiff) हमें दो (या अधिक) फ़ाइलों की सामग्री की तुलना करने की अनुमति देती है।

लेकिन दो निर्देशिकाओं को पुनरावर्ती रूप से मर्ज करने के लिए (डिफमार्गर और इसी तरह के उपकरणों की तरह) कई फाइलों की सामग्री की तुलना करना संभव है?


क्या आपके संबंधित फ़ोल्डरों के लिए किसी प्रकार का VCS उपयोग में है? यह जवाब और प्लगइन्स की एक पूरी श्रृंखला को खोलेगा जो फ्लैट फ़ोल्डरों के लिए उपलब्ध नहीं हो सकता है।
कालेब

जवाबों:


30

वहाँ है DirDiff.vim प्लगइन ( GitHub ) को बदलने और दो निर्देशिकाओं को पुन: विलय करने के लिए।

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

उपयोग:

:DirDiff <dir1> <dir2>

अधिक जानकारी / सहायता के लिए: :help dirdiff

स्क्रीनशॉट देखें:

wlee स्क्रीनशॉट

यह भी देखें:


ब्लॉग के लिंक को तोड़ दिया जाता है - बल्कि ब्लॉग को हटा दिया गया है।
drevicko

1
@drevicko धन्यवाद, मैंने संग्रहित लिंक के साथ बदल दिया है
kenorb

4

मैं pythonफ़ाइलों को मर्ज करने के लिए एक रैपर स्क्रिप्ट का उपयोग करता हूं (नीचे देखें)। यह एक सरल संस्करण है जो मैं अपने ~/.vimडायर और इस तरह के विलय के लिए उपयोग करता हूं ।

इसे पायथन 2 और 3 में काम करना चाहिए; लेकिन शायद सेंटोस और कुछ अन्य डिस्ट्रो के साथ पायथन के बहुत पुराने संस्करणों में नहीं।

ध्यान रखें कि कुछ जांचें (जैसे कि बाइनरी फ़ाइलों के लिए, या यदि फ़ाइलें समान हैं) बहुत तेज़ नहीं हैं (यह पूरी फ़ाइल पढ़ता है); यदि आप चाहें तो आप उन्हें निकाल सकते हैं।

यह भी रिपोर्ट नहीं करता है कि क्या केवल एक निर्देशिका में मौजूद है ...

#!/usr/bin/env python
from __future__ import print_function
import hashlib, os, subprocess, sys

if len(sys.argv) < 3:
    print('Usage: {} dir1 dir2'.format(sys.argv[0]))
    sys.exit(1)

dir1 = os.path.realpath(sys.argv[1])
dir2 = os.path.realpath(sys.argv[2])

for root, dirs, files in os.walk(dir1):
    for f in files:
        f1 = '{}/{}'.format(root, f)
        f2 = f1.replace(dir1, dir2, 1)

        # Don't diff files over 1MiB
        if os.stat(f1).st_size > 1048576 or os.stat(f2).st_size > 1048576: continue

        # Check if files are the same; in which case a diff is useless
        h1 = hashlib.sha256(open(f1, 'rb').read()).hexdigest()
        h2 = hashlib.sha256(open(f2, 'rb').read()).hexdigest()
        if h1 == h2: continue

        # Don't diff binary files
        if open(f1, 'rb').read().find(b'\000') >= 0: continue

        subprocess.call(['vimdiff', f1, f2])

3

मैंने कुछ समय के लिए ऐसा ही चाहा है। सबसे अच्छा समाधान मुझे vdwrap का उपयोग करना था , जो आश्चर्यजनक रूप से अच्छी तरह से काम करता है। यह सब करता है के लिए लपेटो git difftool --dir-diffहै vimdiff। इसके लिए किसी विम प्लग की आवश्यकता नहीं है।

आपको बस इतना करना है कि git difftoolआप इसका उपयोग करें vdwrap:

git config --global difftool.vdwrap.cmd '/full/path/vdwrap $LOCAL $REMOTE'
git config --global diff.tool vdwrap

अगली बार जब आप git difftool का उपयोग करते हैं, तो यह प्रत्येक जोड़ी फ़ाइलों के लिए अलग Vim टैब के साथ Vim खोलेगा।

एक चेतावनी यह है कि यह एक Zsh स्क्रिप्ट है। इसे बैश स्क्रिप्ट में बदलना बहुत सरल होना चाहिए, लेकिन मैंने यह नहीं जाना।



2

यदि आप बस कुछ भी अतिरिक्त स्थापित किए बिना vimdiff का उपयोग करना चाहते हैं, तो निम्न आदेश उत्तराधिकार में सभी अलग-अलग फ़ाइलों को खोल देगा जिससे आप vimdiff के साथ परिवर्तनों को देख पाएंगे:

    for files in $(diff -rq dir1 dir2|grep 'differ$'|sed "s/^Files //g;s/ differ$//g;s/ and /:/g"); do 
        vimdiff ${files%:*} ${files#*:}; 
    done

1

उसके लिए एक हल्का समाधान है:

  1. Vimdiffext plugin सेट करें ।
  2. diff dir1 dir2 | vim -R -खोल पर करो ।

यह बदले हुए फ़ाइलों के लिए सिलवटों और साइड-बाय-साइड तुलना को जोड़ देगा।

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