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

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

diff -r dir1/ dir2/

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

Есть предложения?

Ответы [ 9 ]

1015 голосов
/ 15 февраля 2011

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

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
280 голосов
/ 01 сентября 2012

Я использую команду:

diff -qr dir1/ dir2/

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

diff  --brief --recursive dir1/ dir2/

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

91 голосов
/ 17 марта 2014

Мне нравится использовать git diff --no-index dir1/ dir2/, потому что он может отображать различия в цвете (если у вас установлен этот параметр в вашем git config) и потому что он показывает все различия в длинном постраничном выводе с использованием «less».1002 *

31 голосов
/ 06 декабря 2016

Эти две команды в основном делают то, что просили:

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 вычисляет контрольные суммы в больших кусках, прежде чем сравнивать их. Это группирует операции ввода-вывода в большие порции и приводит к более эффективной обработке, когда все происходит на одном диске.

16 голосов
/ 09 февраля 2017

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

meld dir1/ dir2/

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

9 голосов
/ 18 сентября 2015

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

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
3 голосов
/ 14 июня 2017

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

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

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

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

2 голосов
/ 15 марта 2018

Чтобы найти diff, используйте эту команду:

diff -qr dir1/ dir2/

-r будет также отображать все подкаталоги -q заставляет diff сообщать, только когда файлы различаются.

diff  --brief dir1/ dir2/

- краткое описание покажет файлы, которые существуют в каталоге.

Или иначе

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

meld  dir1/ dir2/
0 голосов
/ 28 ноября 2017

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

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

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

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

...