在 Linux 系统中比较两个目录?
简介
比较两个目录是很常见的情况。许多不同的因素促使我们想要找出两件事之间是否存在真正的差异。例如,当出现问题时,我们通常希望找出与先前情况的不同之处。
我们将学习如何使用命令行进行目录比较。我们可以使用不同的方法来比较目录列表。我们还将了解一些最常用的命令及其选项。
设置
在本教程中,我们将在 /temp 目录内创建一些示例目录。
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
示例必须包含至少两种文件:相同的(文件名、大小等相同)和不同的(文件名、大小等不同)。这样我们就可以轻松比较不同比较工具的结果。
命令行工具
我们几乎总是可以使用一个名为 diff 的旧 Unix 实用程序来查看两个文件(或目录)的不同之处。diff 实用程序用于比较文件,它能够比较目录和文件。有很多选项,但其中两个对我们的案例最有用。以下是一些帮助您查看不同类型的文件格式和目录的递归内容的命令示例:
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
另一个用于比较两个列表的有用选项是 --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 实用程序使用文件内容进行比较,这在比较大量文件时可能会导致明显的延迟。
终端文件管理器
一些文件管理器也提供文件管理器目录比较功能。要在 Midnight Commander 中比较两个目录,可以使用命令/比较目录菜单选项或 ctrl+x d 键盘组合。选择它们时将显示不同的选项:
它不会使其递归,但我们可以根据时间戳、大小和内容分别选择快速、仅大小和彻底的选项。
Vifm 中的文件比较比目录比较更高级。它们默认是递归的。如果您想查看左右面板中文件的差异,只需运行 -filemanager internal :comparedir 命令即可。它显示一个条目列表,突出显示其中一些条目,并将其他条目显示为虚线。
GUI 方法
如果系统上可以使用图形桌面,那么我们可以使用更强大的工具。Meld 就是这样一个例子。比较的结果非常清晰——我们可以轻松地看到哪些项目不同,以及比较双方缺少哪些项目。
此外,此时,您可以通过双击 Windows 资源管理器中的特定文件名来查看每个文件内容的差异。您还可以按类别进行筛选:
最后,我们可以选择按内容比较或仅比较时间戳,这可能会大大提高比较速度。
结论
我们已经看到了几种在 Linux 上比较目录内容的不同方法。
我们首先演示了适用于所有 Linux 操作系统的 CLI 方法。接下来,我们使用高级工具检查了一些更直观的方法。我们还讨论了一些可能影响比较性能的因素。