如何在go lang中获取两个目录内容之间的差异

时间:2017-09-21 04:41:14

标签: go diff

我可以通过diff包运行os命令来获取两个目录内容之间的差异,如下所示,

command := "diff --brief -r /home/kasun/Documents/Old-directory/ " +
    "/home/kasun/Documents/New-directory/"

out, err := exec.Command("sh", "-c", command).Output()
if err != nil {
    fmt.Println("error occured")
    fmt.Printf("%s", err)
}
fmt.Printf("%s", out)

由于diff是仅在bash中可用的命令,因此构建上述代码形成的二进制文件不能用于在Windows系统中获取差异。有没有其他方法可以实现相同,以便它可以在任何平台上工作,比如使用标准的go库执行diff。提前致谢

2 个答案:

答案 0 :(得分:0)

  

因为diff是仅在bash中可用的命令,所以通过构建上述代码形成的二进制文件不能用于在Windows系统中获取diff

如果你安装(解压缩到你想要的任何地方){} {{}}(如latest Portable Git

如果将该安装添加到PATH,则确实有diff(将在Go程序中使用)

vonc@VONCAVN7 C:\
> where diff
D:\prgs\git\latest\usr\bin\diff.exe

但如果您不想依赖现有的第三方安装软件(此处为Git),您可以考虑在项目中PortableGit-2.14.1-64-bit.7z.exe进行销售。
如果确实有spcau/godiff

请注意,使用Git 2.17(2018年第二季度),Git可以更好地识别Go,因为“git diff”和朋友们学习了Go语言源文件的funcname模式。

diff implementation for Windowscommit 1dbf0c0(2018年3月1日) (由Alban Gruin (``)合并于Junio C Hamano -- gitster --,2018年3月8日)

  

userdiff:为Golang添加内置模式

     

这为Golang添加了xfuncnameword_regex模式   流行的编程语言。它还包括测试用例   xfuncname正则表达式(commit 077cde9)和更新的文档。

     

xfuncname正则表达式查找函数,结构和接口   虽然Go语言禁止开口支架独立   行,正则表达式不强制,能够匹配   func这样的陈述:

func foo(bar int,
    baz int) {
}
     

测试用例t4018涵盖了这一点。

     

word_regex模式查找标识符,整数,浮点数,复数   数字和运算符,根据go规范。

答案 1 :(得分:0)

正确的方法可能是以递归方式遍历目录并检查&匹配每个相应文件的md5校验和。然而,这很乏味,如果您确定您的文件结构不是太大或允许,那么只需创建两个目录的tar gz然后计算&比较tar包上的md5校验和或sha256sum。

相关问题