当前位置:首页>Linux>Linux命令每日一清单027:diff--文件比较命令速查表

Linux命令每日一清单027:diff--文件比较命令速查表

  • 2026-09-07 10:48:37
Linux命令每日一清单027:diff--文件比较命令速查表

diff是Linux/Unix系统中用于逐行比较两个文件或目录差异的标准工具。它能够精确显示两个文本文件之间的不同之处,是代码审查、配置文件对比、补丁创建和版本控制等领域的基础工具。

diff支持多种输出格式(正常格式、上下文格式、统一格式、并排格式),并提供丰富的过滤选项来忽略特定类型的差异(如大小写、空白字符等)。通过结合patch命令,diff生成的差异文件可以用于在不同系统间传递修改内容。掌握diff是进行文本分析和版本管理的必备技能。

1. 基本用法

命令说明
diff file1 file2
比较两个文件(正常格式)
diff -u file1 file2
统一格式输出(最常用)
diff -c file1 file2
上下文格式输出
diff -y file1 file2
并排格式输出
diff file1 file2 > file.patch
保存差异到补丁文件
diff -s file1 file2
文件相同时报告信息

2. 输出符号说明

符号输出格式含义
<
正常格式
来自第一个文件的行的行(被删除)
>
正常格式
来自第二个文件的行(被添加)
-
统一/上下文格式
行被删除
+
统一/上下文格式
行被添加
!
上下文格式
行被修改
@@
统一格式
hunk头部,显示行号信息
***
上下文格式
第一个文件的分隔符
---
上下文格式
第二个文件的分隔符

3. 目录比较

命令说明
diff -r dir1 dir2
递归比较两个目录树
diff -rq dir1 dir2
仅报告哪些文件不同(不显示具体差异)
diff -rN dir1 dir2
将缺失的文件视为空文件进行比较
diff -rNu dir1 dir2
统一格式递归比较(用于生成补丁)
diff -r --exclude=*.log dir1 dir2
排除匹配模式的文件
diff -r --exclude-dir=.git dir1 dir2
排除指定目录

4. 过滤选项

忽略特定类型的差异:

选项说明
-i
忽略大小写差异
-w
忽略所有空白字符差异
-b
忽略空白字符数量的变化
-B
忽略空行差异
--strip-trailing-cr
忽略Windows换行符(CR)差异
-E
忽略制表符展开导致的差异
-Z
忽略行尾空白字符
--ignore-matching-lines=REGEX
忽略匹配正则表达式的行

示例:

diff -i file1 file2           # 忽略大小写
diff -w config1.conf config2.conf   # 忽略空格差异
diff -B --strip-trailing-cr win.txt linux.txt  # 忽略空行和CR差异

5. 常用选项

选项说明
-u
统一格式输出(推荐,最易读)
-c
上下文格式输出
-y
并排格式输出
-U n
统一格式中显示n行上下文(默认3行)
-C n
上下文格式中显示n行上下文
-W n
并排格式中设置列宽度
-s
文件相同时显示信息
--color
彩色输出差异
-q
简洁输出(仅报告文件是否不同)
-a
将所有文件视为文本文件
-d
尝试更智能的匹配算法(较慢)

6. 补丁工作流程

diff与patch配合使用,实现修改的保存和恢复:

命令说明
diff -u file1 file2 > file.patch
为单个文件创建补丁
diff -rNu dir1 dir2 > dir.patch
为目录创建补丁
patch file1 < file.patch
将补丁应用到文件file1
patch -p1 < dir.patch
应用目录补丁(剥离1级路径)
patch -R file1 < file.patch
反转(撤销)补丁
patch --dry-run < file.patch
测试补丁应用而不实际修改
patch -b file1 < file.patch
应用补丁并备份原文件(file1.orig)

补丁级别说明(-pN):

  • -p0:完整路径(从当前目录开始)
  • -p1:剥离第一个路径分量
  • -p2:剥离前两个路径分量

7. 实用组合模式

命令说明
diff -u file1 file2 | less
分页查看差异
diff -rq dir1 dir2
快速找出目录中哪些文件不同
diff --color=always file1 file2 | grep -E '^[+-]'
仅显示修改的行
diff -u file1 file2 | grep '^+' | wc -l
统计新增行数
diff -rN -x "*.o" src/ dest/
比较源码目录,排除目标文件
git diff --no-index file1 file2
使用git diff替代(更友好的输出)
diff -y -W 120 file1 file2 | colordiff
彩色并排比较(需安装colordiff)

8. 输出格式示例

统一格式(-u):

--- file1.txt   2026-04-01 10:00:00
+++ file2.txt   2026-04-01 10:05:00
@@ -1,4 +1,4 @@
 line1
-line2
+line2 modified
 line3
 line4

正常格式(默认):

2c2
< line2
---
> line2 modified

并排格式(-y):

line1                     line1
line2                   | line2 modified
line3                     line3

9. 与其他命令配合

命令说明
diff file1 file2 | grep '^<' | wc -l
统计file1独有的行数
diff file1 file2 | grep '^>' | wc -l
统计file2独有的行数
diff file1 file2 | grep '^[<>]' | wc -l
统计总差异行数
comm -23 <(sort file1) <(sort file2)
找出file1有但file2没有的行
diff -u file1 file2 | patch -p0
直接应用diff输出

10. 常用选项速查

选项完整名称说明
-u
--unified
统一格式输出
-c
--context
上下文格式输出
-y
--side-by-side
并排格式输出
-r
--recursive
递归比较目录
-q
--brief
仅报告文件是否不同
-s
--report-identical-files
文件相同时报告
-i
--ignore-case
忽略大小写
-w
--ignore-all-space
忽略所有空白
-b
--ignore-space-change
忽略空白数量变化
-B
--ignore-blank-lines
忽略空行
-N
--new-file
缺失文件视为空
-x
--exclude
排除匹配模式的文件
-X
--exclude-from
从文件读取排除模式
--color
-
彩色输出
--strip-trailing-cr
-
忽略CR换行符

11. 故障排查

问题解决方法
diff显示整个文件不同
检查换行符差异(Windows vs Linux),使用--strip-trailing-cr
补丁应用失败(hunk rejected)
文件版本不匹配;使用-F增加匹配行数;检查补丁格式
目录比较输出太多
使用-q仅列出差异文件;使用-x排除特定文件
空白差异干扰结果
使用-w或-b忽略空白差异
二进制文件显示乱码
diff默认处理文本,使用-a强制文本模式;二进制文件使用cmp
并排输出列宽不足
使用-W增加宽度(如-W 200)
彩色输出不显示
使用--color=always;确保终端支持颜色

温馨提示: 在代码审查和配置管理场景中,推荐使用统一格式(diff -u),它最易读且是patch工具的标准输入。对于配置文件比较,使用-w忽略空格差异可以避免因缩进格式不同而产生的误报。生成补丁前,建议先用diff -q快速确认文件是否相同。在脚本中使用diff时,可以通过退出码判断文件是否相同(0=相同,1=不同,>1=错误)。对于大型目录的比较,考虑使用rsync -n或find组合替代,效率更高。

本文PDF格式下载:

  关注公众号(haopython),请回复: LLTDIFF

最新文章

随机文章