Як розрізнити і об'єднати два каталоги?


38

Я знаю, що різний режим Vim ( vimdiff) дозволяє нам порівнювати вміст двох (або більше) файлів.

Але чи можна порівняти вміст декількох файлів у різних каталогах, щоб рекурсивно об'єднати два каталоги (наприклад, DiffMerge та подібні інструменти)?


Чи використовується VCS будь-якого типу для ваших відповідних папок? Це відкриє цілий спектр відповідей та плагінів, які можуть бути недоступні для плоских папок.
Калеб

Відповіді:


30

Існує плагін DirDiff.vim ( GitHub ) для розрізнення та об'єднання двох каталогів рекурсивно.

Він виконує рекурсивний розріз у двох каталогах і генерує "вікно" diff. На підставі цього вікна ви можете виконувати різні операції, такі як відкриття двох файлів у режимі diff Vim, копіювати файл або каталог рекурсивно в інший або видаляти дерево каталогів із вихідного каталогу.

Використання:

:DirDiff <dir1> <dir2>

Для отримання додаткової інформації: :help dirdiff

Дивіться скріншот:

скріншот wlee

Дивись також:


посилання на блог dedm порушено - швидше блог видалено.
drevicko

1
@drevicko Дякую, я замінив посилання на архівний
kenorb

4

Я використовую сценарій обгортки pythonдля об'єднання файлів (див. Нижче). Це спрощена версія того, що я використовую для злиття своїх ~/.vimпанів та іншого.

Він повинен працювати в Python 2 і 3; але, мабуть, не в дуже старих версіях Python, що постачаються разом з CentOS та деякими іншими дистрибутивами.

Майте на увазі, що деякі перевірки (як, наприклад, бінарні файли або файли однакові) не дуже швидкі (він читає весь файл); ви можете їх видалити, якщо хочете.

Він також не звітує, якщо a присутній лише в одному з каталогів ...

#!/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. Тут не потрібні додатки vim.

Все, що вам потрібно зробити, - це сказати 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. Перетворити його на скрипт bash слід досить просто, але я не давав цього йти.



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 .
  2. Робіть diff dir1 dir2 | vim -R -при оболонці.

Це додасть складки та порівняльне порівняння для змінених файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.