存在于两个不同目录中的差异文件

Posted

技术标签:

【中文标题】存在于两个不同目录中的差异文件【英文标题】:Diff files present in two different directories 【发布时间】:2011-01-02 10:54:39 【问题描述】:

我有两个具有相同文件列表的目录。我需要使用diff 命令比较两个目录中存在的所有文件。是否有一个简单的命令行选项可以做到这一点,还是我必须编写一个 shell 脚本来获取文件列表然后遍历它们?

【问题讨论】:

【参考方案1】:

diff 不仅可以比较两个文件,它还可以通过使用-r 选项遍历整个目录树,递归检查每个目录树中可比较点上出现的子目录和文件之间的差异。

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

【讨论】:

【参考方案2】:

Diff 有一个选项 -r 就是为了做到这一点。

diff -r dir1 dir2

【讨论】:

【参考方案3】:

您可以为此使用diff 命令:

diff -bur folder1/ folder2/

这将输出一个忽略空格的递归差异,具有统一的上下文:

b 标志表示忽略空格 u标志表示统一的上下文(前后3行) r 标志表示递归

【讨论】:

您可以通过下载GNU utilities for Win32来访问diff命令。 我还发现 --brief 选项很有用;你会得到一个更改文件的列表,并且可以单独处理它们 如果你使用 rub 而不是 bur 更容易记住这个命令,即diff -rub folder1/ folder2/ 我想如果你生活在寒冷的气候中,-bur 会很容易记住。【参考方案4】:

如果是 GNU diff,那么您应该能够将它指向两个目录并使用 -r 选项。

否则,请尝试使用

for i in $(\ls -d ./dir1/*); do diff $i dir2; done

注意正如 Dennis 在 cmets 部分中指出的那样,您实际上不需要在 ls 上执行命令替换。我已经这样做了很长时间,以至于我几乎都是在自动驾驶仪上这样做并替换我需要的命令来获取我的文件列表以进行比较。

另外我忘了补充说,我使用 '\ls' 来暂时禁用我的 ls 对 GNU ls 的别名,这样我就会丢失 GNU ls 返回的列表中的颜色格式信息。

【讨论】:

不用ls:for i in ./dir1/* @Dennis,时髦的快捷方式。 +1。尽管它是自动的,但我已经习惯于执行命令替换,并且我只使用我需要的任何命令,例如有时我正在使用查找。使用 ls 还可以让我更多地使用目录列表,例如基于反向时间而不是默认顺序。【参考方案5】:

如果您只想查看不同的文件,您可以使用:

diff -qr dir_one dir_two | sort

选项“q”将只显示不同的文件而不显示不同的内容,“排序”将按字母顺序排列输出。

【讨论】:

太棒了!也可以有效地工作-即,如果整个子目录仅存在于其中一个目录中,则它会停止重复出现并仅报告子目录本身(没有后续内容)。非常好! 这是一个非常好的第一步:看看确实有什么不同,然后然后在每一对上做一个详细的diff不同的文件。如果只有一个或两个文件不同,而不是几十个文件不同,那么一个人的方法就会大不相同。我可能会迷失在diff同时处理几十个文件的输出中! 另外,可以在命令中包含-x PATTERN 以排除某些子目录。例如,diff -qr repo1 repo2 -x ".git" 将比较两个目录(repo1 和 repo2),但会排除各个目录的 .git 文件夹中的文件。【参考方案6】:

这是一个显示两个文件夹中文件之间差异的脚本。它以递归方式工作。更改 dir1 和 dir2。

(search()  for i in $1/*; do [ -f "$i" ] && (diff "$1/$i##*/" "$2/$i##*/" || echo "files: $1/$i##*/   $2/$i##*/"); [ -d "$i" ] && search "$1/$i##*/" "$2/$i##*/"; done ; search "dir1" "dir2" )

【讨论】:

【参考方案7】:

试试这个:

diff -rq /path/to/folder1 /path/to/folder2      

【讨论】:

这会复制现有答案并且不添加新内容。除非您确实有新的贡献,否则请不要发布答案。 投反对票,因为这不会增加任何东西,应该删除它【参考方案8】:

如果您特别不想比较文件的内容而只检查两个目录中不存在的文件,您可以比较由另一个命令生成的文件列表。

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n' 告诉find 不要在输出路径前加上根目录。

我还添加了sort 以确保find 的两个调用中的文件顺序相同。

末尾的grep 删除有关相同输入行的信息。

【讨论】:

对于在find 中不支持printf 的系统,例如macos,可以尝试diff &lt;(cd DIR1 &amp;&amp; find . | sort) &lt;(cd DIR2 &amp;&amp; find . | sort) | grep '^[&lt;&gt;]' 之类的东西【参考方案9】:

在实践中,这个问题经常与一些限制一起出现。在这种情况下,下面的解决方案模板可能会派上用场。

cd dir1
find . \( -name '*.txt' -o -iname '*.md' \) | xargs -i diff -u '' 'dir2/'

【讨论】:

【参考方案10】:

在磁盘上使用 git/svn 或多个 git/svn 实例时,这对我来说是过去 5-10 年中最有用的事情之一,可能有人会觉得有用:

diff -burN /path/to/directory1 /path/to/directory2 | grep +++

或:

git diff /path/to/directory1 | grep +++

它为您提供了不同文件的快照,而不必“减少”或“增加”输出。然后,您只需对各个文件进行比较。

【讨论】:

以上是关于存在于两个不同目录中的差异文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令比较文件差异 diff

用于比较两个不同目录中文件内容的Python程序

Django下存在两个及其以上的APP时,不同APP下templates目录中同名.html文件造成冲突。

Centos-对比文件差异-diff

linux对比两个文件的差异

linux比较两个目录的差异