Linux 给定两个目录树,如何找出哪些文件的内容不同?

Linux 给定两个目录树,如何找出哪些文件的内容不同?,linux,bash,shell,unix,diff,Linux,Bash,Shell,Unix,Diff,如果我想找出两个目录树之间的差异,我通常只执行: diff -r dir1/ dir2/ 这将准确地输出相应文件之间的差异。我只想得到一个内容不同的对应文件列表。我假设这只是将命令行选项传递给diff,但在手册页上找不到任何内容 有什么建议吗?试试: diff--brief--recursive dir1/dir2/ 或者,使用短标志-qr: diff-qr dir1/dir2/ 如果您还想查看两个目录中可能不存在的文件的差异: diff--brief--recursive--新文件dir

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

diff -r dir1/ dir2/
这将准确地输出相应文件之间的差异。我只想得到一个内容不同的对应文件列表。我假设这只是将命令行选项传递给
diff
,但在手册页上找不到任何内容

有什么建议吗?

试试:

diff--brief--recursive dir1/dir2/
或者,使用短标志
-qr

diff-qr dir1/dir2/
如果您还想查看两个目录中可能不存在的文件的差异:

diff--brief--recursive--新文件dir1/dir2/#带有长选项
带有短标志别名的diff-qrN dir1/dir2/#
我使用的命令是:

diff -qr dir1/ dir2/
这和马克的答案完全一样:)但是他的答案让我很困扰,因为它使用了不同类型的旗帜,这让我看了两遍。使用Mark更详细的标志可以:

diff  --brief --recursive dir1/ dir2/

我很抱歉在另一个答案完全可以接受的情况下发布。无法阻止自己。。。努力减少迂腐

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

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

diff -Naur dir1/ dir2
包含最终目录正斜杠并不重要

此外,在一些较旧/服务器版本的diff上,
-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

使用
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 dir1/dir2/
Meld有许多用于比较文件或目录的选项。如果两个文件不同,则很容易进入文件比较模式并查看确切的差异。

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

我特别喜欢它可以扩散到文件中:

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

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

您可以使用
Rsync
find
。对于
查找

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
但是,具有相同名称和相同子文件夹但内容不同的文件将不会显示在列表中


如果你是GUI的粉丝,你可以检查上面提到的。它在windows和linux中都可以正常工作。

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

diff -qr dir1/ dir2/
-r也将区分所有子目录-q告诉diff仅在文件不同时报告

diff  --brief dir1/ dir2/
--brief将显示目录中存在的文件

或其他

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

meld  dir1/ dir2/

要报告dirA和dirB之间的差异,同时更新/同步,请执行以下操作:

rsync -auv <dirA> <dirB>
rsync-auv

整洁。谁会想到git可以区分任意目录,而不仅仅是针对其文件的repo?Perl脚本在这里非常有用,可以与svn和普通diff一起使用。如果您(像我一样)将2个dir作为独立的git项目/repo进行比较,那么您需要添加
--无索引
,更多信息。我已经更新了@alan porter answer。我喜欢这一个,我还发现如果您将
--name status
添加到命令行,它只会显示文件名列表,其中带有“M/A/D”标志,表示修改/添加/删除状态。这样,两个目录实际上都包含.git文件夹,如何将其从比较中排除?关于其中一个目录的副本,如何仅获取另一个目录中额外的文件/目录?在unix(而不是linux)上使用
dircmp
命令完全欣赏一致性,但不要感觉不好;我也对马克的答案投了赞成票;)。。那么,用不同的口味给出不同的答案有意义吗?不!把两个答案合并成一个一致的答案有意义吗?是的!;)只是一个问题;
q
代表什么?它是某物的缩写吗?我找不到
q
背后的任何逻辑。@kramer65-它与“--brief”相同,但我想你可能想知道为什么q?也许能快点?根据手册页,“忽略空白量的变化”取-b。@kramer65我相信
q
代表
安静的
,通常意味着不那么冗长。很好。但是较短的是
diff-qr-dir1/dir2/
,我的扩展版本是
diff-qr-dir1/dir2/| grep'different'
@skv不完全是原始问题所问的,而是更新答案以适应这个问题。@MikeMaxwell它需要是
--简短的
-brief
被解释为
-b-r-i-e-f
,换句话说,它是一组标志,而不是一个选项。@daboross:哇,我使用Unix/Linux已经有一段时间了,但我从未意识到这一点