如何使用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
是朋友)。