Каков наилучший и самый простой способ сравнения двух структур каталогов без фактического сравнения данных в файлах? Это прекрасно работает:
diff -qr dir1 dir2_
Но он очень медленный, потому что сравнивает файлы тоже. Для этого есть переключатель diff или другой простой инструмент cli?
linux
comparison
Ион
источник
источник
-type d
опцию из ответа @ slartibartfast или проверить мой ответ.Ответы:
Следующее (если вы замените первый каталог на directory1, а второй на directory2) должно сделать то, что вы ищете, и быстро:
Основополагающий принцип заключается в том, что он распечатывает все каталоги, включая пути к подкаталогам, относительно базовых каталоговN.
Это может упасть (привести к странным выводам), если у вас есть возврат каретки в некоторых именах каталогов, но нет других.
источник
diff -rq
просто показывает, что корневой каталог существует в одном и продолжает.предоставит вам хорошее параллельное отображение двух иерархий каталогов со сложенными общими разделами.
источник
Я обычно использую
rsync
для этой задачи:БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ, чтобы всегда использоватьопцию
-n
, aka--dry-run
, или она будет синхронизировать (изменять содержимое) каталогов.При этом файлы будут сравниваться по времени и размеру файла ... Я думаю , это то, что вы действительно хотите, или, по крайней мере, вы не против, если это так? У меня есть ощущение, что вы просто хотите, чтобы это происходило быстрее , а не для того, чтобы игнорировать разницу между содержимым файлов. Если вы хотите, чтобы в нем не отображались разные файлы с одинаковыми именами, я думаю, что добавление
--ignore-existing
опции сделает это.Также следует помнить , что не вводя
/
в концеDIR1
заставит его сравнить каталогDIR1
с содержанием вDIR2
.Вывод будет немного многословным, но он покажет вам, какие файлы / каталоги различаются. Файлы / каталоги, присутствующие в,
DIR2
а не в,DIR1
будут начинаться со словомdeleting
.В некоторых ситуациях ответ @ slartibartfast может быть более уместным, хотя вам нужно убрать
-type d
опцию, чтобы включить список файлов, не входящих в каталог.rsync
будет быстрее, если у вас есть значительное количество файлов / каталогов для сравнения.источник
deleting...
текст, но это, вероятно, один из лучших способов сравнения файлов при сохранении скорости. Другие ответы здесь быстрее, когда различие файлов не требуется ... как в примере с OP, но мне действительно нравится этот.sudo -u nobody rsync -nav --delete d1 d2
при условии, что флаги для «других» позволяют читать.Аналогичен ответу ls, но если вы установите дерево, вы можете
источник
diff <( tree dir1 ) <( tree dir2 )
i
флагом, который не печатает линии дерева (tree -i dir1
и т. Д.). Если структура каталогов отличается в одном месте, другие совпадающие файлы могут иметь больше или меньше|
символов в выводе дерева, и diff поймает эти строки, даже если пути к файлам идентичны.Я просто искал решение этой проблемы. Решение, которое мне понравилось больше всего, было:
Это дает вам 3 столбца: 1 - файлы только в DIR1, 2 - файлы только в DIR2, 3 - файлы только в DIR3. Для более подробной информации смотрите этот пост в блоге.
источник
DIR3
указано? Все, что я вижу, этоDIR1
иDIR2
.DIR1
в столбце 1 , все файлы только вDIR2
в колонке 2 , и все файлы , разделяемые и в колонке 3 . Это полезно, но знаете ли вы, как можно удалить столбец 3 и оставить только различия? У меня много файлов для сортировки, и большинство из них идентичны. Мне не нужно видеть, что то же самое.comm <(ls DIR1) <(ls DIR2)
не работает рекурсивно. Для этого я использовалcomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
рекурсивно сканирует каталоги иls -1
(обратите внимание, что это единица , а не буква L )ls
выдает только одно имя файла на строку.comm -3
(см.man comm
).Затем просто рассмотрите два списка.
источник
Это оптимальное решение
Переключатель --brief сообщает только о том, отличаются ли файлы, а не о деталях различия.
источник
-q
вопрос, который является псевдонимом для--brief
. Этот ответ не предоставляет никакой новой информации.But it's really slow because it's comparing files too.
используйте "diff -qr", чтобы получить разные файлы, а затем отфильтруйте сравнение файлов с помощью grep, чтобы получить только имена файлов, которые находятся только в одном из каталогов.
источник
Это сработало для моей конкретной необходимости найти отсутствующие файлы в деревьях, которые, как ожидается, будут совпадать.
источник
Я думаю, что только rsync удобен. Почему?
diff полезен только для структур, хранящих файлы и каталоги. Diff не дает адекватных кодов выхода, когда мы используем символические ссылки. В этой ситуации diff может вернуть 2 кода выхода, даже если src и dst идентичны (время, размеры, имена, временные метки, указывающие программные ссылки и т. Д.).
dir, файловая система не гарантирует порядок файлов, даже если содержимое каталогов в src и dst идентично. Возможно, вам следует отфильтровать вывод ls, отсортировав его. Но чистый ls отображает только имена узлов.
может быть, сценарий, включающий diff, cmp, test -X для типов узлов, будет полезен, но помните о перегрузке, создаваемой многими запусками test / cmp. Сценарий будет очень медленным.
Как обычно, если вы хотите получить простую информацию «dirs is / not same», вы должны использовать rsync с опцией -n (dry). Если вы хотите найти отличия, используйте команду diff.
источник