Как различить и объединить две директории?

38

Я знаю, что diff mode Vim ( vimdiff) позволяет нам сравнивать содержимое двух (или более) файлов.

Но можно сравнить содержимое нескольких файлов в разных каталогах, чтобы рекурсивно объединить два каталога (например, DiffMerge и аналогичные инструменты)?

kenorb
источник
Используются ли какие-либо VCS для ваших соответствующих папок? Это откроет целый ряд ответов и плагинов, которые могут быть недоступны для плоских папок.
Калеб

Ответы:

30

Существует плагин DirDiff.vim ( GitHub ) для рекурсивного сравнения и слияния двух каталогов.

Он выполняет рекурсивный diff для двух каталогов и генерирует "окно" diff. На основе этого окна вы можете выполнять различные операции сравнения, такие как открытие двух файлов в режиме сравнения Vim, рекурсивное копирование файла или каталога в другой или удаление дерева каталогов из исходного каталога.

Использование:

:DirDiff <dir1> <dir2>

Для получения дополнительной информации / помощи: :help dirdiff

Смотрите скриншот:

скриншот

Смотрите также:

kenorb
источник
ссылка на блог dedm не работает - скорее блог был удален.
drevicko
1
@drevicko Спасибо, я заменил ссылку на архивную
kenorb
4

Я использую скрипт-обертку pythonдля объединения файлов (см. Ниже). Это упрощенная версия того, что я использую, чтобы объединить мои ~/.vimкаталоги и тому подобное.

Это должно работать в Python 2 и 3; но, вероятно, не в очень старых версиях Python, поставляемых с CentOS и некоторыми другими дистрибутивами.

Имейте в виду, что некоторые проверки (например, проверка двоичных файлов или одинаковые файлы) выполняются не очень быстро (считывает весь файл); Вы можете удалить их, если хотите.

Это также не сообщает, присутствует ли только в одном из каталогов ...

#!/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 должно быть довольно просто, но я не дал этого.

Акшай
источник
связанные: stackoverflow.com/questions/8156493/git-vimdiff-and-dirdiff
Чиро Сантилли 新疆 改造 中心 法轮功 六四 事件
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
Jongab
источник
1

Для этого есть легкое решение:

  1. Установите плагин vimdiffext .
  2. Делай diff dir1 dir2 | vim -R -на ракушке.

Это добавит сгибы и параллельное сравнение для измененных файлов.

Юрий Ершов
источник