给定两个目录树,如何找出哪些文件因内容而异?

如果我想找到两个目录树之间的差异,我通常只需执行:

diff -r dir1/ dir2/

这将准确地输出相应文件之间的差异。我感兴趣的只是获取内容不同的相应文件的列表。我假设这只是将命令行选项传递给diff的问题,但我在手册页上找不到任何东西。

有什么建议吗?

620048 次浏览

尝试:

diff --brief --recursive dir1/ dir2/

或者,使用短标志-qr

diff -qr dir1/ dir2/

如果您还想查看两个目录中可能不存在的文件的差异:

diff --brief --recursive --new-file dir1/ dir2/  # with long optionsdiff -qrN dir1/ dir2/                            # with short flag aliases

我使用的命令是:

diff -qr dir1/ dir2/

这和Mark的完全一样:)但他的回答让我很困扰,因为它使用了不同的类型标志,这让我看了两遍。使用Mark更冗长的标志,它将是:

diff  --brief --recursive dir1/ dir2/

我很抱歉在另一个答案完全可以接受的时候发帖。我无法阻止自己…努力不那么迂腐。

我喜欢使用git diff --no-index dir1/ dir2/,因为它可以显示颜色的差异(如果您在git配置中设置了该选项),并且因为它使用“less”显示长分页输出中的所有差异。

频道同胞“billings”(freenode/#centos名气)与我分享了他的方法:

diff -Naur dir1/ dir2

包括最终目录的正斜杠并不重要。

此外,-u选项似乎在某些较旧的/server版本的diff上不可用。

差异的区别:

# diff -Nar /tmp/dir1 /tmp/dir2/diff -Nar /tmp/dir1/file /tmp/dir2/file28a29> TEST
# diff -qr /tmp/dir1/ /tmp/dir2/Files /tmp/dir1/file and /tmp/dir2/file differ

使用rsync

rsync --dry-run --recursive --delete --links --checksum --verbose /dir1/ /dir2/ > dirdiff_2.txt

或者,使用diff

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

它们在功能上是等效的,但性能可能会有所不同,具体取决于:

  • 如果目录位于同一驱动器上,则rsync更快。
  • 如果目录位于两个单独的驱动器上,则diff更快。

这是因为diff并行地在两个目录上放置几乎相等的负载,最大化两个驱动器上的负载。rsync在实际比较它们之前在大块中计算校验和。这将i/o操作分组在大块中,并在单个驱动器上发生时导致更有效的处理。

Meld也是比较两个目录的好工具:

meld dir1/ dir2/

Meld有许多用于比较文件或目录的选项。如果两个文件不同,很容易进入文件比较模式并查看确切的差异。

透视镜是一个很棒的基于命令行的目录差异工具。

我特别喜欢它,它可以diff文件:

它将递归解压多种档案,并将各种二进制格式转换为更易于人类阅读的形式来比较它们。它可以同样轻松地比较两个tarball、ISO图像或PDF。

它不仅会告诉您哪些文件不同,还会告诉您它们如何不同。

您可以使用Rsyncfind。对于find

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

但是具有相同名称和相同子文件夹但内容不同的文件将不会显示在列表中。

如果您是GUI的粉丝,您可以检查@陈志立提到的Meld。它在windows和linux中都可以正常工作。

要查找diff,请使用此命令:

diff -qr dir1/ dir2/

-r也会diff所有子目录-q告诉diff仅在文件不同时报告。

diff  --brief dir1/ dir2/

--简短将显示目录中存在的文件。

不然的话

我们可以使用Meld,它将在图形窗口中显示它很容易找到差异。

meld  dir1/ dir2/

要在更新/同步的同时报告迪尔A和迪尔B之间的差异:

rsync -auv <dirA> <dirB>