Contents

如何在Linux上比较两个目录

1. 简介

比较两个目录是一项非常常见的任务。有很多原因使我们对寻找差异感兴趣。例如,当出现问题时,我们通常想弄清楚与以前的状态相比发生了什么变化

在本教程中,我们将学习如何比较 Linux 上的两个目录。我们可以通过多种方式比较目录,具体取决于系统上可用的方式。

2. 设置

出于本教程的目的,我们将在*/tmp*文件夹中准备示例目录:

Dir1                             Dir2    
├── client.log                   ├── client.log
├── file01                       ├── file01
├── file02                       ├── file02
├── file03                       ├── file03
│                                ├── file04
├── server.log                   ├── server.log
├── subdir1                      ├── subdir1
│   ├── file11                   │   ├── file11
│   └── file12                   │   └── file12
├── subdir2                      └── subdir2
│   ├── file21                       ├── file21
│   └── file22                       ├── file22
└── subdir3                          └── file23
    ├── file31
    └── file32

样本目录有任何应该通过比较来检测的差异——相同的项目、不同的项目以及项目只存在于一个目录中而不存在于另一个目录中。这样,我们将能够遵循以下比较工具的输出并更容易地解释结果。

3. 命令行实用程序

首先,我们几乎总是可以使用最古老的 Linux 实用程序之一*diff *来了解目录的不同之处。

通常旨在比较文件内容,diff 实用程序也能够比较目录。它有很多选项,其中两个与我们的案例最相关。它们是:–brief隐藏有关不同文件内容的详细信息,–recursive显示所有子目录的差异:

diff --brief --recursive Dir1 Dir2
Files Dir1/client.log and Dir2/client.log differ
Files Dir1/file02 and Dir2/file02 differ
Files Dir1/file03 and Dir2/file03 differ
Only in Dir2: file04
Files Dir1/subdir1/file12 and Dir2/subdir1/file12 differ
Files Dir1/subdir2/file22 and Dir2/subdir2/file22 differ
Only in Dir2/subdir2: file23
Only in Dir1: subdir3

diff实用程序的另一个有用选项是*–exclude*,它允许在比较范围内过滤掉我们不感兴趣的项目。要从上面的示例中排除所有*.log 文件,我们将 –exclude=’*.log’ 添加到命令中:

diff --brief --recursive Dir1 Dir2 --exclude '*.log'
Files Dir1/file02 and Dir2/file02 differ
Files Dir1/file03 and Dir2/file03 differ
Only in Dir2: file04
Files Dir1/subdir1/file12 and Dir2/subdir1/file12 differ
Files Dir1/subdir2/file22 and Dir2/subdir2/file22 differ
Only in Dir2/subdir2: file23
Only in Dir1: subdir3

我们应该记住的一件事是diff实用程序按内容比较文件,这可能会导致大量比较数据时出现明显延迟。

4.终端文件管理器

几个文件管理器也提供目录比较功能。在*Midnight Commander 中,我们选择Command/Compare Directories菜单项或Ctrl-x d*快捷方式来比较管理器文件面板中显示的目录。不同的项目将显示为选中:

/uploads/compare_two_directories/1.png

限制是它不会递归,但我们可以分别根据时间戳、大小和内容在QuickSize onlyThorough选项之间进行选择。

vifm 文件管理器中的目录比较更高级,默认情况下是递归的。要查看左右面板中目录之间的差异,我们使用文件管理器的内部:compare命令。它会产生一个视图,其中不同的条目被突出显示,错过的条目显示为点线:

/uploads/compare_two_directories/2.png

5. GUI 方法

当系统上有图形桌面可用时,我们可以使用更高级的实用程序。*Meld *是一个功能丰富的比较工具。比较的结果非常直观——我们可以很容易地从比较的两侧识别出不同的项目以及遗漏的项目:

/uploads/compare_two_directories/3.png

而且,此时,可以通过双击特定的文件名来跟踪每个文件的文件内容的差异。过滤选项也可用。

最后但同样重要的是,我们可以选择仅按内容或大小和时间戳进行比较,这可能会显着提高比较速度。