我有两个具有相同文件列表的目录。我需要使用diff命令比较两个目录中存在的所有文件。是否有一个简单的命令行选项可以做到这一点,或者我必须编写一个shell脚本来获得文件列表,然后遍历它们?


当前回答

在实践中,这个问题常常伴随着一些限制条件而出现。在这种情况下,下面的解决方案模板可能会派上用场。

cd dir1
find . \( -name '*.txt' -o -iname '*.md' \) | xargs -i diff -u '{}' 'dir2/{}'

其他回答

Diff有一个选项-r,它的意思就是这样做。

"迪尔一德二

如果您特别不想比较文件的内容,而只是检查哪个文件不在两个目录中,您可以比较由另一个命令生成的文件列表。

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'告诉find不要在输出路径前面加上根目录。

我还添加了sort,以确保在两次find调用中文件的顺序是相同的。

末尾的grep删除关于相同输入行的信息。

Diff不仅可以比较两个文件,它还可以通过使用-r选项遍历整个目录树,递归地检查每棵树中出现在可比性点上的子目录和文件之间的差异。

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

另一个不错的选择是über-diff-tool分光镜:

$ diffoscope a b

它还可以发出不同的JSON, html, markdown,…

当在磁盘上使用git/svn或多个git/svn实例时,这对我来说是过去5-10年里最有用的事情之一,有人可能会发现它很有用:

diff -burN /path/to/directory1 /path/to/directory2 | grep +++

or:

git diff /path/to/directory1 | grep +++

它为您提供了不同文件的快照,而无需“减少”或“增加”输出。你只需要在各个文件上有所不同。

你可以使用diff命令:

diff -bur folder1/ folder2/

这将输出一个忽略空格的递归差分,具有统一的上下文:

B标志表示忽略空白 U标志表示统一上下文(前后各3行) R标志表示递归