如何使用 diff 命令比较 Linux 终端中的文本文件
你是否有过两个相似的文件,想知道哪些部分是不同的?或者您是否正在编写代码,并试图弄清楚如何融入您或其他程序员所做的更改?那么现在有一个叫做“diff”的标准 Linux 实用程序可以为你提供帮助。
比如当您需要在 Linux 中比较两个包含相似文本的文件时,使用 diff 命令可以使您的任务更加轻松。该命令将比较两个文件,以建议更改,使文件相同。
请继续阅读,diff 是一个标准的 Linux 命令行实用程序,本文通过简单易懂的示例了解 diff 命令及其选项的更多信息。以下是你如何利用它的方法。
什么是 Diff?
Diff 是一个显示两个文本文件之间差异的实用程序,这也是 Diff 名称的由来。它是 POSIX 标准的一部分,这意味着它存在于几乎所有类Unix系统中,包括 Linux、macOS 和其他 BSD。
diff代表差异。此命令用于通过逐行比较文件来显示文件中的差异。与其他成员cmp和comm不同,它告诉我们一个文件中的哪些行需要更改,以使两个文件相同。
重要的是要记住,diff使用某些特殊符号和指令,这是使两个文件相同所必需的。它告诉您如何更改第一个文件以使其与第二个文件匹配的说明。
如果您使用的是主流Linux发行版,那么您很可能拥有 GNU 版本。如果您使用的是最小 Linux 发行版,那么您可能将它作为 BusyBox 或Toybox 库的一部分,如果您使用的是 BSD 系统,则可以将其作为 BSD 版本的一部分。你可以通过查看手册页来查看你的版本:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
man diff
diff 支持的其他选项包括:
- -a 或 –text diff 将以文本形式查看文件并逐行比较。
- -b 或–ignore-space-change 比较文件时忽略空白。
- -B 或 –ignore-blank-lines 不检查空白行。
- -c 显示全部内文,并标出不同之处。
- -C<行数>或–context<行数> 与执行”-c-<行数>”指令相同。
- -d 或–minimal 使用不同的演算法,以较小的单位来做比较。
- -e 或–ed 此参数的输出格式可用于 ed 的脚本文件。
- -f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
- -H或–speed-large-files 比较大文件时,可加快速度。
- -i或–ignore-case 不检查大小写的不同。
- -l或–paginate 将结果交由pr程序来分页。
- -n或–rcs 将比较结果以RCS的格式来显示。
- -p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
- -q 或 –brief 仅显示有无差异,不显示详细的信息。
- -r 或 –recursive 比较子目录中的文件。
- -s 或 –report-identical-files 若没有发现任何差异,仍然显示信息。
- -S <文件>或 –starting-file<文件> 在比较目录时,从指定的文件开始比较。
- -t 或 –expand-tabs 在输出时,将tab字符展开。
- -T 或 –initial-tab 在每行前面加上tab字符以便对齐。
- -u,-U<列数>或–unified=<列数> 以合并的方式来显示文件内容的不同。
- -v 或–version 显示版本信息。
- -w 或–ignore-all-space 忽略全部的空格字符。
- -W <宽度>或–width<宽度> 在使用-y参数时,指定栏宽。
- -x <文件名或目录>或–exclude<文件名或目录> 不比较选项中所指定的文件或目录。
- -X <文件>或–exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
- -y 或–side-by-side 以并列的方式显示文件的异同之处。
- –help 显示帮助。
用 diff 比较 Linux 上的两个文件
diff 命令的输出
要比较两个文本文件,只需将它们的路径作为参数传递给 diff:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
diff linuxmi1.txt linuxmi2.txt
Diff 将显示文件中两者之间不同的行。第一个文件中的行以“<”开头,第二个文件中的行以“>”字符开头。输出显示更改、追加或删除的行,包括总体上受影响的行数。
如果更改第 3 行,diff 将输出“3c3”,这意味着“从第 3 行开始,更改第 3 行。”在diff中,“a”表示“追加”,“c”表示“更改”,“d”表示“删除”
Diff 其他功能和选项
要并排查看文件,使用 -y 选项,-W 大写W,当指定-y的时候设置列的宽度,默认是130
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
diff -y linuxmi1.txt linuxmi2.txt
Diff -y 输出信息
unified 格式是一个选项(-u),您可以添加它来显示输出,而不需要任何多余的上下文行。要做到这一点,使用命令:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
diff -u linuxmi1.txt linuxmi2.txt
现在,让我们检查一下 unified 格式示例文件的输出:
diff -u 输出信息
显示关于第一个文件的信息的行以
---
开头,而指示第二个文件的行以
+++
开头。 前两行显示两个文件的名称和时间戳:
--- linuxmi1.txt 2022-11-08 04:34:00.144034315 +0800
+++ linuxmi2.txt 2022-11-08 04:37:35.356044577 +0800
@@ -1,3 +1,3 @@ 显示了两个文件的行范围。
下面的行显示了文件的内容,以及如何修改 linuxmi1.txt 使其与 linuxmi2.txt 相同。当这一行以:
-(减去):它需要从第一个文件中删除。
+(加号):它需要被添加到第一个文件。
如果没有符号,则线保持不变。
在上面的例子中,输出指示应该删除 linuxmi,而应该添加 www.linuxmi.com。
在像 Git 这样的分布式版本控制系统被广泛使用之前,开源项目会通过电子邮件征求这种格式的补丁,然后用补丁程序将它们应用到代码库中。
现在你可以用 diff 在 Linux 上比较文件
diff 实用程序显示结果可能不太好懂,但它有助于了解两个文件之间的差异,无论您是简单地比较文件还是向开源开发人员提交补丁。
如果你不是 Linux 终端的爱好者,你甚至不需要使用命令行来比较文件,甚至根本不需要使用本地机器。有一些在线工具可以让你比较网络上的文件。