Я знаю, что могу рекурсивно сравнить два каталога 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
Это означает, что для каждого файла вместо поиска по иерархии каталогов сканируется только один файл.