
Я пытаюсь рекурсивно сравнить два каталога с помощью утилиты командной строки diff
. У меня есть две папки, diff1
и diff2
, с таким содержимым:
diff2
пусто. Но когда я это делаю, diff -r diff1 diff2
я получаю только
$ diff -r diff1 diff2
Only in diff1: folder
Only in diff1: test.html
Это раздражает. Что мне нужно сделать, чтобы diff
рекурсивно работать? Я пробовал --recursive
, но это не помогает. Я на El Capitan, и diff -v
меня достаёт diff (GNU diffutils) 2.8.1
.
решение1
Поведение, которое вы испытали, является намеренным. Я не думаю, что вы можете получить то, что хотите, если только не разрешите инструменты, отличные от diff
. Из вашего комментария:
Когда я читаю «рекурсивно», я предполагаю, что процесс не остановится на первом уровне.
Это не останавливается из-за первого уровня. Помните, что означает рекурсия:
используя функции, которыевызывать себя из своего собственного кода
(источник:здесь; выделено мной)
Представьте, что у вас есть общий подкаталог foo
в обоих diff1
и diff2
. Рекурсия означает, что ваша исходная команда diff -r diff1 diff2
в какой-то момент вызывает
diff -r diff1/foo diff2/foo
Хорошо, на практике это, скорее всего, делается подпрограммой, вызывающей саму себя в рамках одного процесса (но я полагаю, что реализация, которая на самом деле вызывает diff
исполняемый файл, возможна). Тем не менее, логически это выглядит так.
У вас есть diff1/folder
, но нет diff2/folder
. Как вы можете позвонить, diff
чтобы сравнить их? Другими словами, что должно <unknown_name>
быть, чтобы вы получили желаемый вывод из приведенной ниже формы?
diff -r diff1/folder diff2/<unknown_name>
Нет ничего <unknown_name>
подходящего. Рекурсивный diff
не может спуститься до folder
, не превратившись во что-то вроде рекурсивного ls
или find
. Быть рекурсивным ls
или find
не является его работой.
Тем не менее, вы можете выполнять запросы diff1/folder
с помощью ls -R
or find
(рекурсивно по умолчанию), после того как извлечете из diff
этого уроки Only in diff1: folder
.