大家好,我是孔令飞,字节跳动云原生开发专家、前腾讯云原生技术专家;《企业级Go项目开发实战》作者,云原生实战营 知识星球星主。欢迎关注我的公众号【令飞编程】,干货不错过。
在大家的日常工作中有没有遇到以下场景?
- 需要对比 Linux 服务器上的 2 个 文件夹内容的差异,通过这些差异查看内容是否有变更;
- 相比较 2 个文件夹的差异,但是 Linux 系统下只有文件对比工具
vddiff
。
为了能够对比 2 个文件夹内的文件内容差异,我们要么只能一个一个使用 vddiff
对比文件内容。要么,将 2 个文件夹,下载到本地,使用 Windows 或 Mac 系统上的文件夹对比工具进行内容对比。如果文件夹不大,虽然有点麻烦但也能解决问题,但是如果文件夹很大,传输文件会是一个很耗时的过程。
我不知道,你们开发中,有没有经常遇到以上场景。但是,在我的职业生涯中,会频繁遇到以上场景。例如,在开发 OneX 项目的过程中,我会引用一些第三方的包,当我进行包更新的时候,为了能更直观的看到包进行了哪些变更,就会使用 vddiff 工具来对比 2 个版本的文件夹。
那么有没有一个好用的 Linux 系统下的文件夹对比工具,方便我们去对比文件夹的内容差异呢?
我为此调研了很多工具,发现没有特别好用的工具。甚至,我曾经基于 ranger
文件管理器,封装了一个 LInux 系统下的文件夹对比工具,但维护起来很麻烦,而且也不易用。
在之后的开发生涯中,又陆陆续续,从 GitHub 上调研此类工具,直到找到了工具 vddiff
。
vddiff
是一个文件夹对比工具,非常轻量、易用,也提供了非常强大的功能。之后,所有的 Linux 系统下的文件夹对比,我都用的是 vddiff
,有 6 年之久。
所以,今天我也想把这个 Linux 下的文件夹对比工具分享给你。如果你有更好的 Linux 文件夹对比工具,也环境评论区分享出来。
viddiff
工具介绍
vddiff(vim directory diff),是一个轻量的基于 Linux 命令行终端的文件夹对比工具。vddiff 使用 vim 来进行实际的内容对比,如果系统中没有安装 vim,则会使用 diff file_1 file_2 | less
命令,来对比文件内容。vddiff 工具只会对比普通文件和符号链接文件,支持通过 -r
选项递归对比文件夹内容。
vddiff
工具还可以对比压缩文件,工具会自动根据文件名后缀,如:bz2
、gz
、tar
、tbz
、tgz
、txz
、xz
、zip
和 Z
,来判断是否是压缩文件,如果是压缩文件,则会先解压再对比。但,我更建议的使用方式是自己手动在 Linux 系统下解压压缩文件,再用 vddiff 工具进行对比,直接对比压缩文件,有时候会导致 Linux 终端输出紊乱。
下面,我来介绍下 vddiff
工具常用的功能。
vddiff
工具安装
要使用 vddiff
工具,首先需要安装 vddiff
。安装方法,很简单,只需执行以下几条简单的命令即可:
$ git clone https://github.com/n-t-roff/vddiff /tmp/vddiff # 克隆源代码
$ cd /tmp/vddiff/
$ ./configure
$ make # 构建 vddiff 工具的部署二进制文件
$ sudo make install # 安装 vddiff 工具
vddiff
工具使用指南
虽然 vddiff
工具很清凉,但还是支持了不少文件夹对比功能。具体可以通过 man vddiff
命令查看其支持的所有命令行选项。因为命令行选项很多,有些并不常用,这里列举一些高频的使用方式。
递归对比 2 个文件夹内容差异
这是使用最频繁、最核心的一个功能。我们可以执行以下命令来对比:
$ vddiff -r onex.1 onex.2
-r
表示递归对比。对比结果如下:
可以看到,输出结果其实是由 2 列组成:
- 第一列,代表了对比差异的类型,有以下 7 种类型:
- ’ ':说明对比结果无差异;
- ‘!’:说明对比结果有不同;
- ‘<’:说明文件只存在于第一个目录中;
- ‘>’:说明文件只存在于第二个目录中;
- ‘=’:说明 2 个文件的 inode 号相同;
- ‘-’:对比有错误;
- ‘X’:在两列模式中,说明文件类型不同。
- 第二列,指明了有差异的文件名。
仅显示 2 个目录中都存在的目录和不同的文件
执行以下命令:
$ vddiff -rc onex.1 onex.2
-c
选项,用来设置对比结果中只展示 2 个对比目录中都存在的目录和不同的文件。输出如下:
通过 -c
选项可以让我们更快、更直观的看到不一样的文件和目录。可以直接在差异文件上,键入 Enter 键盘,就会进入到对比界面,查看差异点,例如:在 .go-version
文件上键入 Enter 进入对比界面,如下:
默认用 vimdiff
命令来对比 2 个文件。键入::qall
从对比界面返回。
注意,-c
只会显示有差异的文件或文件夹,不会显示文件会否存在 A,不存在于 B 这种场景。如果你想查看 2 个文件夹中,文件是否只存在于 X 文件目录中,可以使用 -n
选项,命令如下:
$ vddiff -rn onex.1 onex.2
输出如下:
仅显示与模式匹配的文件名
执行以下命令:
$ vddiff -rF Makefile onex.1 onex.2
-F
选项,设置 vddiff 工具仅显示与模式匹配的文件名。输出结果如下:
对比时打开/关闭大小写
可执行以下命令,在对比时区分大小写:
$ vddiff -rI onex.1 onex.2
可执行以下命令,在对比时不区分大小写:
$ vddiff -ri onex.1 onex.2
总结
在 Linux 系统中进行开发、测试、部署等操作时,经常会遇到对比 2 个目录中,文件差异的需求。Windows 或 MacOS 中,有不少易用的文件夹对比工具,但是在 Linux 系统中很缺乏这类工具。为了能够对比 2 个目录,我们经常会把目录下载到 Windows/MacOS 中,进而对比 2 个文件夹,但是这种方式很低效。在 Linux 系统中,我们可以使用 vddiff 工具来对比目录中文件的差异,本文也介绍了 vddiff 的安装和使用方法。
- 您的支持是我写作的最大动力!如果这篇文章对您有帮助,感谢点赞和关注;
- 关注公众号【令飞编程】,干货不错过。回复【资料】免费获取全套 Go + 云原生学习资料;