给定两个目录树,如何找出哪些文件有所不同?

时间:2011-02-14 21:52:08

标签: linux bash shell unix diff

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

diff -r dir1/ dir2/

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

有什么建议吗?

10 个答案:

答案 0 :(得分:997)

你说Linux,所以你运气好了(至少它应该可用,不确定何时添加):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

应该做你需要的。

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

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options

答案 1 :(得分:279)

我使用的命令是:

diff -qr dir1/ dir2/

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

diff  --brief --recursive dir1/ dir2/

当其他答案完全可以接受时,我很抱歉。无法阻止自己......努力减少迂腐。

答案 2 :(得分:90)

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

答案 3 :(得分:31)

这两个命令基本上要求的是:

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

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

它们之间的选择取决于dir1和dir2的位置:

当目录驻留在两个单独的驱动器上时,diff优于rsync。但是当比较的两个目录在同一个驱动器上时,rsync会更快。这是因为diff在两个目录上并行地施加了几乎相等的负载,从而最大化了两个驱动器的负载。

rsync在实际比较它们之前计算大块中的校验和。它将i / o操作分组为大块,并在单个驱动器上进行更有效的处理。

答案 4 :(得分:16)

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

meld dir1/ dir2/

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

答案 5 :(得分:9)

频道同胞'账单'(freenode /#centos成名)与我分享他的方法:

diff -Naur dir1/ dir2

包括最终目录正斜杠无关紧要。

此外,似乎-u选项在某些较旧/服务器版本的差异上不可用。

差异的差异:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ

答案 6 :(得分:3)

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

我特别喜欢它可以将分成文件:

  

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

它不仅会告诉您哪些文件不同,还会告诉您它们的区别。

答案 7 :(得分:3)

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

rsync -auv <dirA> <dirB>

答案 8 :(得分:2)

要查找diff,请使用以下命令:

diff -qr dir1/ dir2/

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

diff  --brief dir1/ dir2/

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

或者

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

meld  dir1/ dir2/

答案 9 :(得分:0)

您可以also使用Rsyncfind。对于find

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

但是名称相同且位于相同子文件夹但内容不同的文件将不会显示在列表中。

如果您是GUI的粉丝,可以查看Meld提到的@Alexander。它在windows和linux中都运行良好。