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

这意味着对于每个文件,只需扫描单个文件,而不是搜索目录层次结构。

相关内容