关于Linux:给定两个目录树,如何找出哪些文件不同?

Given two directory trees, how can I find out which files differ?

如果我想找出两个目录树之间的区别,我通常只执行:

1
diff -r dir1/ dir2/

这将精确输出相应文件之间的差异。我只想得到内容不同的相应文件的列表。我认为这只是将命令行选项传递给diff的问题,但在手册页上找不到任何内容。

有什么建议吗?


你说的是Linux,所以你很幸运(至少它应该是可用的,不确定它是什么时候添加的):

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

应该做你需要的。

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

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


我使用的命令是:

1
diff -qr dir1/ dir2/

这和马克的答案完全一样:)但他的回答让我很不安,因为它使用了不同类型的旗子,这让我看了两遍。使用马克的更详细的标志,它将是:

1
diff  --brief --recursive dir1/ dir2/

当另一个答案完全可以接受时,我很抱歉发布。不能阻止我自己…努力少学点书。


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


这两个命令基本上完成了要求的事情:

1
2
3
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操作分组成大的块,并在单个驱动器上进行操作时产生更高效的处理。


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

meld dir1/ dir2/

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


频道同胞"Billings"(Freenode/Centos Fame)与我分享了他的方法:

1
diff -Naur dir1/ dir2

包括最后一个目录正斜杠并不重要。

此外,在某些较旧/服务器版本的diff上,似乎没有-u选项。

差异的区别:

1
2
3
4
5
6
7
# 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


diffoscope是一个基于命令行的目录diff工具。

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

It will recursively unpack archives of many kinds and transform various binary formats into more human readable form to compare them. It can compare two tarballs, ISO images, or PDF just as easily.

它不仅可以告诉您哪些文件不同,还可以告诉您它们的不同之处。


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

1
diff -qr dir1/ dir2/

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

1
diff  --brief dir1/ dir2/

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

否则

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

1
meld  dir1/ dir2/


您也可以使用Rsyncfind。对于find

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

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

如果你是一个图形用户界面的粉丝,你可以检查一下@alexander提到的Meld。它在Windows和Linux中都可以正常工作。