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

diff -r dir1/ dir2/

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

有什么建议吗?


当前回答

你也可以使用Rsync和find。找到:

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

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

如果你是GUI的粉丝,你可以查看@Alexander提到的Meld。它在windows和linux中都工作得很好。

其他回答

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

用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操作分组为大块,当事情发生在单个驱动器上时,会导致更有效的处理。

Diffoscope是一个伟大的基于命令行的目录差异工具。

我特别喜欢它,它可以区分为文件:

它将递归地解包多种类型的档案,并将各种二进制格式转换为更易于人类阅读的形式,以便进行比较。它可以很容易地比较两个tarball、ISO映像或PDF。

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

报告dirA和dirB之间的差异,同时更新/同步:

rsync -auv <dirA> <dirB>

我使用的命令是:

diff -qr dir1/ dir2/

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

diff  --brief --recursive dir1/ dir2/

我很抱歉在其他答案完全可以接受的情况下发布了这篇文章。无法阻止自己……努力变得不那么迂腐。