Учитывая два дерева каталогов, как я могу узнать, какие файлы отличаются?

466

Если я хочу найти различия между двумя деревьями каталогов, я обычно просто выполняю:

diff -r dir1/ dir2/

Это точно определяет различия между соответствующими файлами. Мне интересно только получить список соответствующих файлов, содержимое которых отличается. Я предположил, что это просто вопрос передачи опции командной строки в diff, но я не смог найти ничего на странице руководства.

Любые предложения?

  • 2
    Дубликат Как сравнить различия между каталогами (Linux)
  • 1
    Что касается одного из каталогов, как получить только те файлы / каталоги, которые являются дополнительными в другом?
Показать ещё 1 комментарий
Теги:
diff

8 ответов

660
Лучший ответ

Вы сказали Linux, так что вам повезло (по крайней мере, он должен быть доступен, не уверен, когда он был добавлен):

diff --brief -r dir1/ dir2/

Должен делать то, что вам нужно.

Если вы также хотите увидеть различия в файлах, которые могут не существовать в любом каталоге:

diff --brief -Nr dir1/ dir2/
  • 20
    Примечание. Это работает и в MacOS X (Yosemite).
  • 10
    Ницца. Но короче - diff -qr dir1/ dir2/ а моя расширенная версия - diff -qr dir1/ dir2/ | grep ' differ'
Показать ещё 12 комментариев
209

Используемая мной команда:

diff -qr dir1/ dir2/

Это точно так же, как и Марк:) Но его ответ беспокоил меня, поскольку он использует разные типы флагов, и это заставило меня посмотреть дважды. Используя Mark более подробные флаги, это будет:

diff  --brief --recursive dir1/ dir2/

Приносим извинения за отправку, когда другой ответ вполне приемлем. Не мог остановить себя... работая на том, чтобы быть менее педантичным.

  • 3
    полностью ценю последовательность - но не чувствую себя плохо; Я тоже проголосовал за ответ Марка;)
  • 8
    ... так есть ли смысл ставить разные ответы просто с другим вкусом? ИМХО нет! Имеет ли смысл объединять оба ответа в один последовательный ответ? да! ;)
Показать ещё 5 комментариев
59

Мне нравится использовать git diff --no-index dir1/ dir2/, потому что он может показать различия в цвете (если у вас есть эта опция, установленная в вашей конфигурации git), и потому, что она показывает все различия в длинном выведенном в эфир выводе с использованием "меньше",.

  • 21
    Ухоженная. Кто бы мог подумать, что git может различать произвольные каталоги, а не только репо с его файлами?
  • 2
    Здесь очень полезен Perl-скрипт colordiff , его можно использовать с svn и обычным diff.
Показать ещё 1 комментарий
14

Эти две команды выполняют в основном задание:

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:

Когда каталоги находятся на двух отдельных дисках, diff превосходит rsync. Но когда два сопоставленных каталога находятся на одном диске, rsync работает быстрее. Это потому, что diff ставит почти равную нагрузку на обе каталоги параллельно, максимизируя нагрузку на два диска.

rsync вычисляет контрольные суммы в больших кусках до фактического их сравнения. Это группирует операции ввода-вывода в больших кусках и приводит к более эффективной обработке, когда все происходит на одном диске.

  • 2
    rsync не только быстрее для файлов на отдельных дисках, но также позволяет сравнивать файлы в подкаталогах, например rsync --options /usr /bin /var /sbin /lib /old_root будет эффективно сравнивать текущий корень / (указав все подкаталоги в it) и /old_root (содержащие, например, некоторую более старую резервную копию / ), что diff -r не может сделать. И если вы предполагаете, что файлы с одинаковым размером, разрешениями и временными --checksum вероятно, не изменились, --checksum обеспечит вам очень быструю (если не так сквозную) проверку того, какие файлы могли измениться.
  • 1
    Какова цель --delete с rsync ?
Показать ещё 4 комментария
5

Канал соотечественника 'billings' (из freenode/# centos fame) поделился своим методом со мной:

diff -Naur dir1/ dir2

Включение конечной косой черты в обратном направлении не имеет значения.

Кроме того, похоже, что опция -u недоступна в некоторых версиях diff более ранних версий/серверов.

Разница в различиях:

# 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
  • 1
    Так что это --new-file/-N который заставляет diff считать отсутствующие файлы пустыми, а --text/-a заставляет его считать все двоичные входные данные текстовыми. Я не вижу плюсов для этого конкретного случая использования.
3

Meld - отличный инструмент для сравнения двух каталогов:

meld dir1/ dir2/

У Meld есть много опций для сравнения файлов или каталогов. Если два файла отличаются друг от друга, легко войти в режим сравнения файлов и увидеть точные различия.

  • 2
    Ницца. Я написал простой Perl-скрипт для сравнения деревьев, но я ограничиваюсь. Кажется, это билет.
  • 0
    Единственная проблема заключается в том, что он не поддается сценариям, поскольку это графическое приложение. Но хорошо, если вы не против графического интерфейса! Благодарю.
1

Diffoscope - отличная утилита для поиска на основе командной строки.

Мне особенно нравится, что он может различаться в файлы:

Он будет рекурсивно распаковывать архивы многих видов и преобразовывать различные двоичные форматы в более удобочитаемую форму для сравнения. Он также может легко сравнивать два архива, изображения ISO или PDF.

Он не только скажет вам, какие файлы отличаются, но и то, как они отличаются.

0

Вы можете также использовать Rsync и find. Для find:

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

Но файлы с одинаковыми именами и в тех же подпапках, но с другим контентом, не будут отображаться в списках.

Если вы являетесь поклонником GUI, вы можете проверить Meld, что @Alexander. Он отлично работает как в окнах, так и в linux.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню