Может ли gnu diff рекурсивно сравнивать только имена файлов в разных структурах папок?

Может ли gnu diff рекурсивно сравнивать только имена файлов в разных структурах папок?

Я знаю, что могу рекурсивно сравнить два каталога diff -qrи вывести только различия. Однако, похоже, это сравнивает позиции файлов в деревьях (например, /a/b/file01 != /b/c/file01).

Я хочу сравнить два разных дерева и получить только уникальные файлы (независимо от их положения в дереве). Так что в приведенном выше примере file01будет считаться совпадением. Возможно ли это с помощью diff, или мне нужно сделать вложенный findцикл и перебрать каждый из них?

решение1

Я бы использовал findи некоторые махинации:

Допустим, есть два пути: /a и /b:

find /a/ /b/ -exec basename \{} \; | sort | uniq -u

Итак, это «найти все файлы в /a и /b и вывести их базовые имена (т. е. путь удален), затем отсортировать их, затем вывести все уникальные значения в списке».

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

for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done

решение2

Я не думаю, что это возможно с diff. Я предполагаю, что вы думаете о чем-то вроде:

find tree1 -type f | while f=`line` ; do diff $f `find tree2 -type f -name "${f##*/}"`; done

(Это необходимо доработать, чтобы разрешить множественные или нулевые экземпляры tree2каждого файла из tree1, а также для встроенных пробелов.)

Чтобы ускорить процесс, можно сначала сохранить список файлов tree2:

find tree2 -type f >tree2.list
find tree1 -type f | while f=`line` ; do diff $f `grep <tree2.list "/${f##*/}$"`; done

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

Связанный контент