0025. shell命令--diff

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

25. shell命令--diff

功能说明

        diff (different)是 Linux 和 Unix 系统上一个非常有用的命令行工具,用于比较两个文件的内容,或者比较文件的一个标准输入版本和另一个文件版本。它的输出可以告诉我们两个文件之间的不同之处,这对于代码审查、文档版本控制等任务非常有用。

        diff 命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

语法格式

diff [选项] 文件1 文件2

SYNOPSIS
       diff [OPTION]... FILES

选项说明

  • -  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
  • -a或--text  diff预设只会逐行比较文本文件。
  • -b或--ignore-space-change  不检查空格字符的不同。忽略空格数量的变化。
  • -B或--ignore-blank-lines  不检查空白行。忽略空行的增加或减少。
  • -c  显示全部内文,并标出不同之处。输出上下文差异格式。与 -u 类似,但提供了更多的上下文行。
  • -C或--context  与执行"-c-"指令相同。
  • -d或--minimal  使用不同的演算法,以较小的单位来做比较。
  • -D或ifdef  此参数的输出格式可用于前置处理器巨集。
  • -e或--ed  此参数的输出格式可用于ed的script文件。
  • -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
  • -H或--speed-large-files  比较大文件时,可加快速度。
  • -I或--ignore-matching-lines  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
  • -i或--ignore-case  不检查大小写的不同。忽略大小写差异。
  • -l或--paginate  将结果交由pr程序来分页。
  • -n或--rcs  将比较结果以RCS的格式来显示。
  • -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:
  • Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
  • -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
  • -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
  • -q或--brief  仅显示有无差异,不显示详细的信息。
  • -r或--recursive  比较子目录中的文件。递归地比较目录。它会比较目录中的同名文件,并递归地处理子目录。
  • -s或--report-identical-files  若没有发现任何差异,仍然显示信息。
  • -S或--starting-file  在比较目录时,从指定的文件开始比较。
  • -t或--expand-tabs  在输出时,将tab字符展开。
  • -T或--initial-tab  在每行前面加上tab字符以便对齐。
  • -u,-U或--unified=  以合并的方式来显示文件内容的不同。输出统一的差异格式(也称为“unified diff”或“patch”格式)。这是最常用的格式之一,因为它易于阅读且常用于版本控制系统(如 Git)。
  • -v或--version  显示版本信息。
  • -w或--ignore-all-space  忽略全部的空格字符。忽略所有的空格差异(包括空格数量和空行)。
  • -W或--width  在使用-y参数时,指定栏宽。
  • -x或--exclude  不比较选项中所指定的文件或目录。
  • -X或--exclude-from  您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。
  • -y或--side-by-side  以并列的方式显示文件的异同之处。
  • --help  显示帮助。
  • --color 或 --colour 在输出中使用颜色来标记差异。
  • --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
  • --suppress-common-lines  在使用-y参数时,仅显示不同之处。
  • --strip-trailing-cr 输入时删除尾随的回车符

实践操作

1. 环境准备
mkdir -p /test/diff
cd /test/diff
seq 12 >file1.txt
seq 13 |rev >file2.txt
mkdir -p dir1/{a..c}/{1,2}
mkdir -p dir2/{a..d}/{1..3}
ls
head -15 -v file*
ls -R dir* |wc -l

2. 仅判断两个文件是否不同
diff --brief file1.txt file2.txt

3. 以正常模式比较差异和并排格式输出
diff file1.txt file2.txt
10c10    #表示第10行不同
< 10    #表示第一个文件内容
---
> 01    #表示第二个文件内容
12c12,13    #表示12行后与第二个文件不同
< 12    #表示第一个文件内容
---
> 21    #表示第二个文件内容
> 31    #表示第二个文件内容

diff file1.txt file2.txt -y -W 50    #并排格式输出
seq 14 >file1.txt
diff file1.txt file2.txt
diff file1.txt file2.txt -y -W 60
说明:
"|"表示前后2个文件内容有不同
"<"表示后面文件比前面文件少了1行内容
">"表示后面文件比前面文件多了1行内容

4. 以上下文 (context) 模式比较差异
diff -c file1.txt file2.txt 

5. 以联合 (unified) 模式比较差异和生成补丁
diff -u file1.txt file2.txt
#当你想将一个文件从版本A更新到版本B时,但不想直接覆盖原始文件
#你可以使用 diff 命令生成一个补丁文件,然后将这个补丁应用到原始文件上。
seq 5 >file1.txt    #模拟版本A
seq 10 >file2.txt    #模拟版本B
diff -u file1.txt file2.txt >patch.txt    #生成一个将 file1.txt 更新到 file2.txt 的补丁
cat file1.txt
patch file1.txt <patch.txt    #使用 patch 命令将这个补丁应用到 file1.txt 上
cat file1.txt

6. 递归地比较两个目录
diff -r dir1/ dir2/
rm -rf dir1/a
diff -r dir1/ dir2/
rm -rf dir2/b
diff -r dir1/ dir2/

命令示例:1. 环境准备

mkdir -p /test/diff
cd /test/diff
seq 12 >file1.txt
seq 13 |rev >file2.txt
mkdir -p dir1/{a..c}/{1,2}
mkdir -p dir2/{a..d}/{1..3}
ls
head -15 -v file*
ls -R dir* |wc -l

输出结果:

[root@MineGi ~]# mkdir -p /test/diff
[root@MineGi ~]# cd /test/diff
[root@MineGi /test/diff]# seq 12 >file1.txt
[root@MineGi /test/diff]# seq 13 |rev >file2.txt
[root@MineGi /test/diff]# mkdir -p dir1/{a..c}/{1,2}
[root@MineGi /test/diff]# mkdir -p dir2/{a..d}/{1..3}
[root@MineGi /test/diff]# ls
dir1  dir2  file1.txt  file2.txt
[root@MineGi /test/diff]# head -15 -v file*
==> file1.txt <==
1
2
3
4
5
6
7
8
9
10
11
12

==> file2.txt <==
1
2
3
4
5
6
7
8
9
01
11
21
31
[root@MineGi /test/diff]# ls -R dir* |wc -l
78
[root@MineGi /test/diff]#

命令示例:2. 仅判断两个文件是否不同

diff --brief file1.txt file2.txt

输出结果:

[root@MineGi /test/diff]# diff --brief file1.txt file2.txt
文件 file1.txt 和 file2.txt 不同
[root@MineGi /test/diff]#

命令示例:3. 以正常模式比较差异和并排格式输出

diff file1.txt file2.txt
diff file1.txt file2.txt -y -W 50
seq 14 >file1.txt
diff file1.txt file2.txt
diff file1.txt file2.txt -y -W 60

输出结果:

[root@MineGi /test/diff]# diff file1.txt file2.txt
10c10
< 10
---
> 01
12c12,13
< 12
---
> 21
> 31
[root@MineGi /test/diff]# diff file1.txt file2.txt -y -W 50
1            1
2            2
3            3
4            4
5            5
6            6
7            7
8            8
9            9
10              |    01
11            11
12              |    21
              >    31
[root@MineGi /test/diff]# seq 14 >file1.txt
[root@MineGi /test/diff]# diff file1.txt file2.txt
10c10
< 10
---
> 01
12,14c12,13
< 12
< 13
< 14
---
> 21
> 31
[root@MineGi /test/diff]# diff file1.txt file2.txt -y -W 60
1                1
2                2
3                3
4                4
5                5
6                6
7                7
8                8
9                9
10                 |    01
11                11
12                 |    21
13                 |    31
14                 <
[root@MineGi /test/diff]#

命令示例:4. 以上下文 (context) 模式比较差异

diff -c file1.txt file2.txt

输出结果:

[root@MineGi /test/diff]# diff -c file1.txt file2.txt
*** file1.txt    2024-12-03 15:08:20.305538645 +0800
--- file2.txt    2024-12-03 15:07:04.047679286 +0800
***************
*** 7,14 ****
  7
  8
  9
! 10
  11
! 12
! 13
! 14
--- 7,13 ----
  7
  8
  9
! 01
  11
! 21
! 31
[root@MineGi /test/diff]# 

命令示例:5. 以联合 (unified) 模式比较差异和生成补丁

diff -u file1.txt file2.txt
seq 5 >file1.txt 
seq 10 >file2.txt 
diff -u file1.txt file2.txt >patch.txt 
cat file1.txt
patch file1.txt <patch.txt
yum install -y -q patch
patch file1.txt <patch.txt
cat file1.txt

输出结果:

[root@MineGi /test/diff]# diff -u file1.txt file2.txt
--- file1.txt    2024-12-03 15:09:42.493107424 +0800
+++ file2.txt    2024-12-03 15:09:42.495107402 +0800
@@ -3,3 +3,8 @@
 3
 4
 5
+6
+7
+8
+9
+10
[root@MineGi /test/diff]# seq 5 >file1.txt 
[root@MineGi /test/diff]# seq 10 >file2.txt 
[root@MineGi /test/diff]# diff -u file1.txt file2.txt >patch.txt 
[root@MineGi /test/diff]# cat file1.txt
1
2
3
4
5
[root@MineGi /test/diff]# patch file1.txt <patch.txt
-bash: patch: 未找到命令
[root@MineGi /test/diff]# yum install -y -q patch
软件包 patch-2.7.1-12.el7_7.x86_64 已安装并且是最新版本
[root@MineGi /test/diff]# patch file1.txt <patch.txt
patching file file1.txt
[root@MineGi /test/diff]# cat file1.txt
1
2
3
4
5
6
7
8
9
10
[root@MineGi /test/diff]#

命令示例:6. 递归地比较两个目录

diff -r dir1/ dir2/
rm -rf dir1/a
diff -r dir1/ dir2/
rm -rf dir2/b
diff -r dir1/ dir2/

输出结果:

[root@MineGi /test/diff]# diff -r dir1/ dir2/
只在 dir2/a 存在:3
只在 dir2/b 存在:3
只在 dir2/c 存在:3
只在 dir2/ 存在:d
[root@MineGi /test/diff]# rm -rf dir1/a
[root@MineGi /test/diff]# diff -r dir1/ dir2/
只在 dir2/ 存在:a
只在 dir2/b 存在:3
只在 dir2/c 存在:3
只在 dir2/ 存在:d
[root@MineGi /test/diff]# rm -rf dir2/b
[root@MineGi /test/diff]# diff -r dir1/ dir2/
只在 dir2/ 存在:a
只在 dir1/ 存在:b
只在 dir2/c 存在:3
只在 dir2/ 存在:d
[root@MineGi /test/diff]#

输出说明

当你使用 diff 命令时,输出通常包括以下内容:

  • a<行号>,b<行号>:表示在文件 a 和 b 中有差异的行。例如,a3,5d 表示在文件 a 中删除了第 3 到 5 行。
    <:表示在文件 a中有而文件b中没有的行。
    >:表示在文件 b中有而文件a中没有的行。
    c<行号>,<行号>c<行号>,<行号>:表示一个代码块(通常是多行)在两个文件中是不同的。

Claude API接入实战:Sonnet与Haiku选型、密钥配置与生产排障 API接口是连接大模型能力与业务系统的工程枢纽,其核心在于身份认证、模型路由与网络可靠性。Anthropic的Claude API并非即插即用服务,而是需深度理解密钥权限粒度、模型推理范式差异及地域合规机制的技术契约。Sonnet强调深度语义校验与事实一致性,适合法律、金融等强逻辑场景;Haiku采用单向流式编译架构,以极低延迟和确定性响应支撑高吞吐实时任务。二者不可混用同一API Key,且密钥本身受base64编码长度、环境变量注入方式、请求头透传规则等多重约束。真实生产中,90%的401错误源于环境变 阅读详情

相关推荐

高可用冗余方案选型指南:从RAID到数据库复制的四层决策逻辑

高可用(High Availability)是保障业务连续性的核心能力,其本质并非追求零故障,而是通过分层冗余设计,在故障发生时控制恢复时间(RTO)与数据丢失量(RPO)。理解RAID、DRBD、MySQL主从复制、PostgreSQL流复制等技术的本质差异至关重要——它们分别作用于磁盘层、主机层、数据库层,解决不同粒度的容错问题。盲目堆砌硬件或套用通用配置,往往导致RTO超标、RPO失控甚至雪崩式故障。本文基于真实生产环境参数与故障复盘,系统梳理四层冗余的技术原理、适用边界与成本权衡,特别聚焦RAID选

weixin_34221073的博客 381

textdiff:简单文本差异脚本

TextDiff类 简单文本区分PHP类。对于日语,为了便于理解,对它进行了“一定程度的划分”。 用法 <?php use Kijtra \ TextDiff \ TextDiff ; $ old_text = "abcg efgh ijk" ; $ new_text = "abcg efg hijk" ; $ diff = new TextDiff ( $ old_text , $ new_text ); // Get raw data $ data = $ diff -> getData (); // Get HTML data (use table tag) $ html = $ diff -> getHtml (); 执照 麻省理工学院 变更日志 v2.1.1 自述文件 保留旧文件路径 将index.php文件重命名为example.php v2.0.0 目前,支持PHP 5.6

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库01

此方案可满足千万级并发需求,同时支持时序数据、知识图谱和文档数据库的高效处理,通过云原生架构实现极致弹性。​:每月约$15-20万(100节点K8s集群+数据库集群+CDN流量)1. 宠物上架/下架流程。

weixin_49199313的博客 1425

Shell 命令集合 文件管理】Linux diff 命令使用教程

Linuxdiff命令是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异,并以易于阅读的格式输出结果。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4328

shell diff命令

目录diff命令作用diff命令用法 diff命令作用 diff命令逐行比较文本文件的异同,如果指定要比较目录,则会比较目录中相同文件名的文件,但不会比较其中子目录。 diff命令用法 1.命令格式: diff [options] files|directorys 2.输出信息: [num1,num2] [a|c|d] [num3,num4] num1,num2: 第一个文件中的行 a: 添加 c...

L*YUE的博客 4094

Linux系统shell程序设计(四)-diff命令详解(理论+实战)

本文主要介绍Linux系统diff命令介绍及用法

qq_27815483的博客 1036

linux diff 补丁文件夹,LINUX下制作补丁文件 diff,patch

diff(differential)功能说明:比较文件的差异。语  法:diff [-abBcdefHilnNpPqrstTuvwy][-;][-C ;][-D ;][-I ;][-S ;][-W ;][-x ;][-X ;][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]补充说明:diff以逐行的方式,比较文本文件的异...

weixin_39765869的博客 351

【信息科学与工程学】【通信工程】第一百九十一篇 路由器体系结构03

编号类型领域问题详细的数学分析(逐步推理)参数列表(表达式 / 数值范围 / 边界 / 测量)关联知识839DCI演进 · 收敛DCI 2030 年三大技术收敛方向步骤1:方向一:IPoDWDM 成为绝对主流(Omdia 2027 59% → 2030 80%+),OTN 退化为 OLS 纯光层。步骤2:方向二:800ZR+ 取代 400ZR 成为主力速率,PCS 使 800G 达 600–1000km。步骤3:方向三:AI 集群 DCI 催生 1.6T/3.2T 超短距(<10km)相干模块(OSFP-X

weixin_49199313的博客 690

【信息科学与工程学】【管理科学】第三十篇 公司治理及公司工作内容08 信息安全与IT类

确定功能单位、系统边界、影响类型。2.

weixin_49199313的博客 454

TextDiff代码对比工具安装教程

这个工具相当小巧,主要用来比较开放源代码的文本,它的功能虽然比商业或者共享文本的比较工具更弱,但是可以完成一般源代码的修改以及比较任务。此外,由于这款软件属于开源软件,你完全可以将它改造得更加的强大,功能更多。 下面开始安装教程: 一、下载软件 官方下载地址:http://www.angusj.com/delphi/textdiff.html 点击下载 解压文件 因...

坤小白的博客 1万+

linux diff-比较给定的两个文件的不同

推荐:更多Linux文件查找和比较命令关注:linux命令大全 diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。 语法 diff(选项)(参数)...

diaoxie6274的博客 737

shell脚本常用基础命令(diff path cut sort)1

diff 用法 一般作补丁,用补丁的方式更新脚本 Usage: diff [OPTION] files|dir 输出信息: 【num1,num2】a|c|d 【num3,num4】 之前是第一个文件的行 之后是第二个文件的行 a 添加 c 更改 d 删除 <第一个文件的内容 ">"第二个文件的内容 a添加 [root@docker3 mnt]# vim yan [root@docker3 mnt]# cat yan > yan1 [root@docker3 mnt]# ls yan y

Redhat_yan 1231

【亲测免费】 推荐开源项目:TextDiff - JavaScript 比较库

推荐开源项目:TextDiff - JavaScript 比较库 项目简介 TextDiff 是一个基于 JavaScript 的文本比较库,它源自 google-diff-match-patch 库,并专为 Node.js 环境进行了优化。这个库能够生成两个文本之间的差异,不仅提供了文本形式的输出,还支持美观的 HTML 格式化显示。您可以通过简单的几行代码,轻松地将这个强大的工具集成到您的项目...

gitblog_00039的博客 1076

Shell-diff用法

文章目录1. 命令作用2. 语法3. 常用参数4. 小案列 1. 命令作用 逐行比较,告诉我们怎么把第一个文件改为第二个文件。显示出第一个文件和第二个文件的差异。 2. 语法 diff [options] file1.txt file2.txt # file1为比较文件 file2为基准比较文件. 3. 常用参数 -b:不检查空格 -B:不检查空白行 -i:不检查大小写 -w:忽略所...

湫兮若风的博客 1362

shell中常用的基础命令diff、patch、cut、sort、tr、test)

Shell是指“为使用者提供操作界面”的软件(command interpreter,命令解析器),它接收用户命令,然后调用相应的应用程序。程序是由数据和逻辑组成的,脚本其实就是一个文本,对于遇到文本的升级,可以通过分析对比脚本的不同,然后进行打补丁。 一、diff 用法:diff [options] files|directorys 输出信息: [num1,num2][a|c|d][num3,num4] num1,num2 :第一个文件中的行 a :添加 c :更改 d :删除 < :第一个文.

qq_38664479的博客 675

shell脚本中常用命令——diff,patch

diff 命令 diff 命令是用来比较两个文件或目录的不同,并且是以行为单位来比对的。一般是用在 ASCII 纯文本文件的比对上。由于是以行为比对的单位,因此 diff 通常是用在同一文件(或软件)的新旧版本差异上对比上,能够借由 diff 创建的分析档,以处理补丁(patch)功能的文件。 diff [options] target1 target2 diff file1 file2 d...

even160941的博客 3526

diff工具

diff工具用于逐行比较文件的不同 注意:diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配。 语法和选项 语法: diff [选项] 文件1 文件2 常用选项: 选项 含义 备注 -b 不检查空格 -B 不检查空白行 -i 不检查大小写 -w 忽略所有的空格 –normal 正常格式显示(默认) -c 上下文格式显示 ...

嵌入式 3154

开源项目 `text-diff` 使用教程

开源项目 text-diff 使用教程 项目介绍 text-diff 是一个用于比较和处理文本差异的 Python 库。它基于 difflib 模块,提供了更加简洁和易用的接口,适用于需要进行文本对比的各种应用场景,如版本控制系统、文档比较工具等。 项目快速启动 安装 首先,你需要安装 text-diff 库。你可以通过 pip 进行安装: pip install text-diff 基本使用 ...

gitblog_00272的博客 1104
上一篇: 02. 目录和文件管理(二)
下一篇: 0026. shell命令--vimdiff
MineGi
博客等级 码龄9年 1853粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值