- En Linux 我们可以使用 diff、sdiff、cmp、comm 或 vimdiff 等控制台工具以及 Meld 或 Diffuse 等图形界面来比较文件和目录。
- diff 命令允许您逐行查看差异,忽略空格、大写字母或空行,并使用 -r、-qo 或 -y 等选项递归比较整个目录。
- Meld 等图形工具可以轻松地使用颜色和箭头比较和合并文件和文件夹,甚至可以与版本控制系统集成。
当你每天与……一起工作时 Linux 和文本文件迟早有一天,你会需要检查两个文件或目录是否完全相同。这种情况可能发生在数据迁移之后、应用程序更新时、查看备份时,或者仅仅是在比较同一文档的两个版本时。 脚本 文件。
这类任务,乍一看似乎很麻烦,如果“凭感觉”去做,但只要掌握了一些技巧,就会变得非常简单。 文件和目录比较工具在Linux系统中,选项范围很广。 comandos 经典之类的 diff, sdiff o comm甚至包括图形实用程序,例如 合并 o 扩散其中包括一些编辑,例如 维姆迪夫 或者彩色包装纸,例如 颜色差异.
在 Linux 中何时以及为何要比较文本和目录。
一个非常典型的例子是当你做出 个人云或服务器迁移 您需要确保所有数据都已正确迁移。想象一下,您正在从 Nextcloud 迁移到 Filerun 等其他解决方案:您复制了数据,一切似乎都很正常,但当您检查旧副本时,却发现文件数量比新位置多。
与其花费数小时浏览目录试图找到缺失的内容,不如使用更合乎逻辑的方法。 终端 并启动一个命令 检测两个目录树之间的差异在这个领域,绝对的王者是 diff它允许您比较整个目录和单个文件,并且还提供了许多参数来调整输出。
在管理过程中,也经常需要进行这些比较。 脚本、配置文件或文档的版本开发人员每天都会使用这些工具来查看文件版本之间的变化,甚至可以准备补丁或将其与 Git、Mercurial 或 Bazaar 等版本控制系统集成。
最后,如果您是系统管理员或分析人员 日志你至少应该掌握基本命令,因为你经常会用到它们。 比较本地日志和远程日志或查看您仅可通过以下方式访问的计算机上的配置更改 SSH的在你手边没有图形工具的情况下。
在 Linux 中使用 diff 比较目录
命令 diff 它不仅用于比较文本:它还可以 递归地比较目录结构这对于验证数据迁移或备份同步非常实用。
最便捷的方式 比较两个完整的目录 可以通过使用以下选项:
diff -rq 'directorio1' 'directorio2'
在这个例子中, diff 它是比较效用, -r 它指示程序递归地遍历所有子目录,并且 -q 它只在屏幕上显示两侧不同的文件和文件夹,避免不必要的干扰。
例如,对于 比较一下你的新云的内容 使用旧版本时,你可以使用类似这样的方法:
diff -rq '/home/usuario/Filerun/@Home' '/media/DATOS/copia_nextcloud'
输出结果将是一个列表,其中包含以下信息: 文件仅存在于其中一个目录中 (例如显示“仅存在于 /path: 文件名”之类的消息)或者同时存在于两个位置但内容不匹配的文件。这是一种非常清晰的检测方法:
- 临时文件 或隐藏 (例如,文件)
.git或堵塞.~lock.)被搁置一旁。 - 空文件夹 或许是某个应用程序尚未上传到云端。
- 真正的改变 在文档、图像或脚本中,您务必仔细审查。
在这些情况下,问题并不总是出在缺少数据上:有时问题出在同步工具本身。 忽略临时文件、锁定文件或空目录这完全可以接受。但多亏了 diff 您可以清楚地看到哪些元素不匹配,并决定如何处理它们。
使用 diff 比较两个文件:二进制文件和文本文件
最广为人知的用途 diff 这是对……的比较 截取两个文件,查看哪些部分的内容发生了变化。这里你需要区分文本文件(你可以逐行详细说明)和二进制文件(你只需要指出它们是否相同)。
检查两个二进制文件是否相等
如果您想知道两个文档是否符合某种格式, ODT、DOC、 PDFMP4 或其他二进制文件 它们完全相同,你可以发射一个。 diff 只需使用两个文件的路径即可:
diff '/home/usuario/Documento_V1.odt' '/home/usuario/Documento_V2.odt'
如果文件相同, 屏幕上不会有任何输出。如果出现任何内部分歧, diff 它会显示类似这样的消息:
Los ficheros binarios Documento_V1.odt y Documento_V2.odt son distintos
在这些情况下,由于它不是纯文本, diff 无法准确地显示究竟发生了什么变化。它只会提示内部内容存在差异。例如,要详细比较两个 ODT 文件,您需要使用 LibreOffice 及其文档比较功能。
深入比较两个文本或 Markdown 文件
当你与 纯文本文件、脚本、配置文件或 Markdown, diff 是的,它可以精确到毫米地显示差异。基本语法是:
diff archivo1 archivo2
假设你有 两个版本 来自 Markdown 文件:
/home/usuario/archivo_1.md/home/usuario/archivo_2.md
运行时:
diff '/home/usuario/archivo_1.md' '/home/usuario/archivo_2.md'
您将获得一个输出结果,其中 每个变化块 遵循以下模式:
linea_fichero_1 tipo_de_cambio linea_fichero_2
< contenido_en_el_primer_fichero
---
> contenido_en_el_segundo_fichero
在这种经典格式中, 关键要素是:
- line_number_file_1:第一个涉及更改的文件的行(或行范围)。
- 汇率: 可 a (添加,添加), c (改变,改变) d (删除,擦除)
- line_number_file_2:受更改影响的第二个文件的行(或范围)。
- <:标记的行与它们在第一个文件中的显示完全一致。
- >:标记第二个文件中的对应行。
例如,如果您看到类似这样的内容:
9c9
< Para usar GEEKLAND y obtener la diferencias existentes entre dos directorios...
---
> Para usar Diff y obtener la diferencias existentes entre dos directorios...
表示 第一个文件的第9行与第二个文件的第9行相比发生了变化。紧邻下方 < 它会向您展示原始内容, > 内容已修改,您可以立即看到更改。
如果出现类似这样的情况:
18a19
> * -q: Para que la salida del comando diff únicamente muestre las diferencias...
它的解释是: 将第二个文件与第一个文件进行比较。文件 2 的第 18 行之后有 新增第 19 行 其内容显示在符号之后 >.
使用 diff -y 可以更直观地查看差异。
如果您觉得古典符号令人困惑, diff 它提供了一种使用选项的更图形化的模式。 -y 为 并排显示两列此外,您还可以用以下方式给行编号: cat -n 为了更好地定位您:
diff -y '/ruta/archivo1.md' '/ruta/archivo2.md' | cat -n
在这种模式下,两个文件并行显示, 使用的中心柱 符号 产生影响这样就能非常清楚地看出哪些线路发生了变化、新增了哪些线路或删除了哪些线路。
如果您只想关注不同的线条,可以添加该选项。 --suppress-common-lines:
diff -y --suppress-common-lines 'archivo1.md' 'archivo2.md'
这样 相同的线条消失了 这样你只能看到两个文本之间实际发生的变化,这在文件很长且大部分内容相同的情况下非常实用。
用于优化比较的主要差异选项
命令 diff 收藏品丰富 允许进行对比的参数 取决于你的兴趣:忽略空格、大写字母、空行,或者更改输出格式。
最常见的选择 (此外 -r, -q y -y) 脱颖而出:
-s:仅当两个文件完全相同时才发出通知,如果您需要确认匹配项,这将非常有用。-i忽略差异 大写和小写 在文本内容中。-b:比较忽略 空白 简单。-E忽略了差异 标签 文件之间。-Z忽略 行尾的空格在代码中非常有用。-B:没有考虑到 空白行 进行比较时。--no-dereference避免遵循 符号链接 比较目录时。--ignore-file-name-case:忽略文件名的大小写差异(在比较列表或目录时)。--no-ignore-file-name-case强制将这些名称差异考虑在内。--suppress-common-lines:有-y它隐藏了相同的行,并突出显示不同的行。
如果您想了解更多信息,只需咨询…… 差异手册页:
man diff
在那里,您可以找到一些不太常见的选项,例如排除某些命名模式、修改输出格式(例如,统一格式)。 -u 对于补丁)或调整每次更改周围显示的上下文的大小。
diff 用于深入的文件夹比较
除了基本示例之外,还有 -rq您可以组合使用多个选项。 优化目录比较例如,如果您想忽略文件名的大小写差异并且不跟踪符号链接,您可以这样做:
diff -rq --no-dereference --ignore-file-name-case dir1 dir2
也可以使用 diff -r 无 -q 这样,除了提醒您哪些文件不同之外, 向您展示内容差异的详细信息 处理文本文件时,输出结果通常比较多。但是,在非常大的目录中,输出结果可能会非常庞大。
对于许多管理员来说, 递归比较目录 这变成了一项例行任务:检查备份是否完整,检查一台服务器上的配置文件夹是否与另一台服务器上的配置文件夹相同,或者验证项目的两个分支是否包含相同的文件结构。
Linux 系统中其他用于比较文本的控制台工具
虽然 diff 它是旗舰级实用程序;Linux 生态系统提供 其他一些用于逐行比较文件的非常有用的命令。有些软件支持并排视图,有些软件要求文件排序,还有一些软件则利用了高级文本编辑器。
sdiff:文本模式下的并排比较
命令 sdiff 如果你想要的话,这很理想。 在终端中并排查看两个文件,并用竖线标明差异之处:
sdiff f1.txt f2.txt
在输出结果中,您将在左侧看到第一个文件中的每一行,在右侧看到第二个文件中对应的行。 最常用的符号是:
|被比较的两条线是不同的。<:仅出现在第一个文件中的行。>:仅出现在第二个文件中的行。
喜欢 diff, sdiff 它还接受以下选项: -i 忽略大小写字母这样您就可以只专注于实际的文本更改,而无需关注大小写变化。
colordiff:差异的彩色输出
读一个 黑白照片的区别 如果变更很多,可能会有点繁琐。 colordiff 这是一个小小的包装纸, 对差异输出应用颜色 为了使其更清晰易读:
colordiff archivo1 archivo2
通常情况下, colordiff 它使用不同的颜色来区分删除、添加和修改的行,让您一眼就能发现更改。此外,您还可以 通过编辑文件来自定义颜色 的配置 /etc/colordiffrc 根据您的喜好。
comm:比较已排序的文件并查看公共行
命令 comm 与 diff 因为 它适用于已经逐行排序的文件。 并生成三列输出:
comm f1.txt f2.txt
出口处你会发现:
- 第一列:第一个文件中的唯一行。
- 第二栏:第二个文件中的唯一行。
- 第三栏:在两者中都出现的行。
这对于 数据集或列表 您想知道哪些条目是通用的,哪些条目是每个文件独有的。但是,如果文件未排序, comm 它会发出警告,而且结果不可靠,所以你应该给他们发一封…… sort.
cmp:逐字节比较
命令 cmp 比较 两个逐字节文件它比……低一个级别 diff用于检测两个文件(文本或二进制文件)是否完全相同:
cmp archivo1 archivo2
如果文件匹配, 屏幕上没有任何显示。如果它们不同, cmp 表示 第一个不同的字节及其对应的行 就文本而言:
archivo1 archivo2 son distintos: byte 1454, línea 43
有选项 -b除了职位之外, cmp 还 显示不同字节的内容 这两个文件都包含这些信息,这对于非常精确的诊断非常有用。
vimdiff(或 vim -d):用于比较 Vim 编辑器的功能
如果你使用 Vim,你会对这个感兴趣。 vimdiff它将文件比较功能直接集成到编辑器中。命令很简单:
vimdiff archivo1 archivo2
好吧:
vim -d archivo1 archivo2
Vim 会在多个窗口中打开文件,突出显示差异,并允许您…… 浏览、编辑和保存更改 使用标准的 Vim 命令。它还支持通过 SSH 进行远程比较,例如:
vimdiff /var/log/secure scp://192.168.1.25/var/log/secure
在这种情况下,你是在进行比较。 通过 SSH 将本地日志与远程日志进行同步。Vim 会自动处理请求凭据和显示这两个文件的操作,就像它们位于本地一样。
Linux 系统中用于比较文本和目录的图形工具
如果您不太熟悉终端,或者更喜欢可视化的界面,Linux 也提供了 用于比较文件和文件夹的专用图形应用程序最受欢迎的可能是 Meld,但它不是唯一的。
Meld:Diff 的文件、目录和项目图形界面
Meld本质上是一个用于差异比较的图形界面。虽然富含多种维生素。它允许 比较和合并文件版本控制系统(如 Git、Mercurial、Bazaar 或 SVN)下的目录甚至项目。
其最有趣的特点之一是 包括:
- 双向和三向比较 文件和目录。
- 自动合并功能 如果没有严重冲突,则自动合并更改。
- 语法高亮 以及通过界面进行基本文件管理。
- 与版本控制系统集成 以及诸如以下命令行工具:
git mergetool. - Un 非常清晰的颜色编码 标记新增、删除或修改的行。
安装很简单,因为 Meld 存在于大多数发行版的软件仓库中。。 例如:
- Debian,Ubuntu,Linux Mint及其衍生产品:
sudo apt install meld - Fedora、CentOS、Alma Linux 及类似操作系统:
sudo dnf install meld - Arch Linux,Manjaro及其衍生产品:
sudo pacman -S meld - SUSE 和 openSUSE:
sudo zypper install meld
运行程序时,您可以选择是否进行比较。 版本控制下的文件、目录或项目选择第一个项目,点击“比较”,然后选择第二个项目。Meld 将显示两个(或三个)面板,其中包含内容和典型的颜色代码: 绿色表示新增的行,红色表示修改的行,灰色带删除线表示删除的行。等等。
此外,在每个差异块中,您将看到 可以使用箭头将更改从一侧复制到另一侧。 只需单击一下,即可大大简化文件两个版本同步的过程,无需手动逐行复制粘贴。
扩散和其他图形替代方案
另一个有趣的图形工具是 扩散它还允许您比较和编辑文本文件,并突出显示差异。它支持比较多个文件,并可与版本控制系统集成。
安装漫射器 在基于 Debian/Ubuntu 或 Fedora 的发行版上,您可以使用:
sudo apt-get install diffuse # Debian/Ubuntu
sudo dnf install diffuse # Fedora
除了融合和扩散之外,还有其他选项,例如 差异合并 (跨平台)或集成到 IDE 和编辑器(VS Code、IntelliJ 等)中的插件,提供非常完善的界面,用于比较和合并代码。
Linux 系统中比较文件的实用技巧和窍门
文件比较只是一种工具;重要的是…… 根据数据类型明智地应用此方法。以下是一些可以节省时间的技巧:
- 如果文件包含 无序列表或数据您或许有兴趣先订购它们。
sort使用之前diffocomm这样一来,比较就更合乎逻辑了。 - 为了避免代码中出现误报,请习惯使用诸如以下的选项:
-b,-Bo-Z忽略空格、空行或尾随空格。 - 如果你只想知道两个文件是否相同,而不想查看详细信息,
diff -qocmp它们比完全差分更直接。 - 比较大型目录时,请考虑使用
diff -rq抢先看然后只深入研究那些看起来与众不同的文件。 - 在开发环境中,依赖于
git diff以及其他集成 使用版本控制系统,其设计目的就是为了突出显示代码中的相关更改。
掌握 Linux 中的这些比较工具,可以让你更好地控制迁移过程、查找配置错误、审查脚本更改,以及总体上更好地管理迁移。 处理关键文件时,工作会更加安全。稍加练习,你就能使用 diff, sdiff, vimdiff, Meld 几乎是熟记于心,你会发现,在比较两个文本或目录时,只需运行几个精心选择的命令,就能节省时间和精力,避免很多麻烦。
对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。

