如何使用Shell脚本在两个不同目录中比较具有相同名称的文件

时间:2020-03-06 14:35:11  来源:igfitidea点击:

在继续使用SVN之前,我曾经通过简单地保留/ develop /目录并在其中编辑和测试文件,然后将它们移至/ main /目录来管理我的项目。当我决定迁移到SVN时,我需要确保目录确实是同步的。

那么,编写shell脚本[bash]递归比较两个不同目录中具有相同名称的文件的一种好方法是什么?

注意:上面使用的目录名称仅用于示例。我不建议将代码存储在顶层:)。

解决方案

diff命令具有-r选项以递归方式比较目录:

diff -r /develop /main

[我读过某个地方,回答我们自己的问题是可以的,所以这里是:)]

我尝试了一下,效果很好

[/]$ cd /develop/
[/develop/]$ find | while read line; do diff -ruN "/main/$line" $line; done |less

我们可以选择仅比较特定文件(例如,仅.php文件),方法是将上述行编辑为

[/]$ cd /develop/
[/develop/]$ find -name "*.php" | while read line; do diff -ruN "/main/$line" $line; done |less

还有其他想法吗?

我可用的差异允许递归差异:

diff -r main develop

但是用一个shell脚本:

( cd main ; find . -type f -exec diff {} ../develop/{} ';' )

diff -rqu /develop /main

它只会以这种方式为我们提供更改摘要:)

如果我们只想查看新文件/丢失的文件

diff -rqu /develop /main | grep "^Only

如果要使其裸露:

diff -rqu /develop /main | sed -rn "/^Only/s/^Only in (.+?): //p"

经典的(系统V Unix)答案是dircmp dir1 dir2,这是一个Shell脚本,它将列出在dir1但不在dir2或者dir2但不在dir1中找到的文件(从" pr`命令,因此使用标题进行分页),然后将每个常见文件与分析进行比较(最常见的结果是相同,不同,目录)。

这似乎正在消失,如果有需要,我可以对其进行独立的重新实现。这不是火箭科学(cmp是朋友)。