Если я хочу найти различия между двумя деревьями каталогов, я обычно просто выполняю:
diff -r dir1/ dir2/
Это точно определяет различия между соответствующими файлами. Мне интересно только получить список соответствующих файлов, содержимое которых отличается. Я предположил, что это просто вопрос передачи опции командной строки в diff
, но я не смог найти ничего на странице руководства.
Любые предложения?
Вы сказали Linux, так что вам повезло (по крайней мере, он должен быть доступен, не уверен, когда он был добавлен):
diff --brief -r dir1/ dir2/
Должен делать то, что вам нужно.
Если вы также хотите увидеть различия в файлах, которые могут не существовать в любом каталоге:
diff --brief -Nr dir1/ dir2/
diff -qr dir1/ dir2/
а моя расширенная версия - diff -qr dir1/ dir2/ | grep ' differ'
Используемая мной команда:
diff -qr dir1/ dir2/
Это точно так же, как и Марк:) Но его ответ беспокоил меня, поскольку он использует разные типы флагов, и это заставило меня посмотреть дважды. Используя Mark более подробные флаги, это будет:
diff --brief --recursive dir1/ dir2/
Приносим извинения за отправку, когда другой ответ вполне приемлем. Не мог остановить себя... работая на том, чтобы быть менее педантичным.
Мне нравится использовать git diff --no-index dir1/ dir2/
, потому что он может показать различия в цвете (если у вас есть эта опция, установленная в вашей конфигурации git), и потому, что она показывает все различия в длинном выведенном в эфир выводе с использованием "меньше",.
Эти две команды выполняют в основном задание:
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 вычисляет контрольные суммы в больших кусках до фактического их сравнения. Это группирует операции ввода-вывода в больших кусках и приводит к более эффективной обработке, когда все происходит на одном диске.
rsync --options /usr /bin /var /sbin /lib /old_root
будет эффективно сравнивать текущий корень /
(указав все подкаталоги в it) и /old_root
(содержащие, например, некоторую более старую резервную копию /
), что diff -r
не может сделать. И если вы предполагаете, что файлы с одинаковым размером, разрешениями и временными --checksum
вероятно, не изменились, --checksum
обеспечит вам очень быструю (если не так сквозную) проверку того, какие файлы могли измениться.
--delete
с rsync
?
Канал соотечественника '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
--new-file/-N
который заставляет diff считать отсутствующие файлы пустыми, а --text/-a
заставляет его считать все двоичные входные данные текстовыми. Я не вижу плюсов для этого конкретного случая использования.
Meld - отличный инструмент для сравнения двух каталогов:
meld dir1/ dir2/
У Meld есть много опций для сравнения файлов или каталогов. Если два файла отличаются друг от друга, легко войти в режим сравнения файлов и увидеть точные различия.
Diffoscope - отличная утилита для поиска на основе командной строки.
Мне особенно нравится, что он может различаться в файлы:
Он будет рекурсивно распаковывать архивы многих видов и преобразовывать различные двоичные форматы в более удобочитаемую форму для сравнения. Он также может легко сравнивать два архива, изображения ISO или PDF.
Он не только скажет вам, какие файлы отличаются, но и то, как они отличаются.
Вы можете также использовать Rsync
и find
. Для find
:
find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
Но файлы с одинаковыми именами и в тех же подпапках, но с другим контентом, не будут отображаться в списках.
Если вы являетесь поклонником GUI, вы можете проверить Meld, что @Alexander. Он отлично работает как в окнах, так и в linux.