如何使用 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 终端的爱好者,你甚至不需要使用命令行来比较文件,甚至根本不需要使用本地机器。有一些在线工具可以让你比较网络上的文件。

来源:如何使用 diff 命令比较 Linux 终端中的文本文件

THE END