我知道我可以递归比较两个目录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
这意味着对于每个文件,只需扫描单个文件,而不是搜索目录层次结构。