it-swarm-ru.tech

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

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

diff -r dir1/ dir2/

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

Какие-либо предложения?

699
Mansoor Siddiqui

Вы сказали 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
1003
Mark Loeser

Команда, которую я использую:

diff -qr dir1/ dir2/

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

diff  --brief --recursive dir1/ dir2/

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

279
FPC

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

91
Alan Porter

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

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

31
CodeBug

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

meld dir1/ dir2/

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

16
Alexander

Соотечественник канала "Биллингс" (известной как 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
9
todd_dsm

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

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

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

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

3
nh2

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

diff -qr dir1/ dir2/

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

diff  --brief dir1/ dir2/

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

или иначе

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

meld  dir1/ dir2/
2
Javeed Shakeel

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

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

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

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

0
Fábio