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

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

2 ответа2

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
1

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .