文件比较 diff

diff 命令用于比较文件或目录的差异。它能精确显示哪些行不同,常用于配置管理、代码审查、版本控制等场景。

基本用法

比较两个文件:

diff file1.txt file2.txt

输出示例:

3c3
< this is line 3 in file1
---
> this is line 3 in file2
7a8
> new line in file2

输出说明:

标记含义
a添加(add)
c改变(change)
d删除(delete)
<第一个文件的内容
>第二个文件的内容

3c3 表示第3行有变化,7a8 表示第7行后添加了内容。

常用选项

选项含义
-u统一格式输出
-c上下文格式输出
-r递归比较目录
-q只报告是否不同
-s报告相同文件
-i忽略大小写
-w忽略空白字符
-B忽略空行

统一格式

-u 选项输出更易读的统一格式:

diff -u file1.txt file2.txt

输出示例:

--- file1.txt
+++ file2.txt
@@ -1,5 +1,5 @@
 line 1
 line 2
-this is line 3 in file1
+this is line 3 in file2
 line 4
 line 5

- 表示删除,+ 表示添加,@@ 显示变化的行号范围。

上下文格式

-c 选项输出上下文格式:

diff -c file1.txt file2.txt

输出示例:

*** file1.txt
--- file2.txt
***************
*** 1,5 ****
  line 1
  line 2
! this is line 3 in file1
  line 4
  line 5
--- 1,5 ----
  line 1
  line 2
! this is line 3 in file2
  line 4
  line 5

! 表示变化的行。

比较目录

-r 递归比较目录:

diff -r dir1/ dir2/
diff -rq dir1/ dir2/

-q 只报告哪些文件不同,不显示具体差异。

并排显示

-y 选项并排显示两个文件:

diff -y file1.txt file2.txt

输出示例:

line 1                line 1
line 2                line 2
this is old         | this is new
line 4                line 4
                    > new line

| 表示变化,> 表示新增,< 表示删除。

配合 -W 设置宽度:

diff -y -W 120 file1.txt file2.txt

生成补丁

diff 可以生成补丁文件,用 patch 命令应用:

diff -u original.txt modified.txt > changes.patch
patch original.txt < changes.patch

对目录生成补丁:

diff -urN original_dir/ modified_dir/ > changes.patch
patch -p1 < changes.patch

-N 把不存在的文件当作空文件处理。

忽略差异

忽略空白

diff -w file1.txt file2.txt
diff -b file1.txt file2.txt

-w 忽略所有空白,-b 忽略空白数量变化。

忽略空行

diff -B file1.txt file2.txt

忽略大小写

diff -i file1.txt file2.txt

忽略匹配行

diff -I ".*Date.*" file1.txt file2.txt

忽略匹配正则表达式的行。

其他比较工具

cmp

cmp 比较二进制文件:

cmp file1.bin file2.bin
cmp -l file1.bin file2.bin

-l 显示所有不同的字节。

sdiff

sdiff 是 diff -y 的增强版:

sdiff file1.txt file2.txt
sdiff -s file1.txt file2.txt

-s 不显示相同的行。

vimdiff

vimdiff 用 Vim 并排显示文件:

vimdiff file1.txt file2.txt

可以在 Vim 中直接编辑和合并。

实用示例

比较配置文件

diff -u /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

检查脚本改动

diff -u script.sh.old script.sh

比较目录差异

diff -rq /etc/nginx/ /etc/nginx.backup/

生成补丁并应用

diff -u original.txt new.txt > fix.patch
patch original.txt < fix.patch

撤销补丁:

patch -R original.txt < fix.patch

找出不同的文件

diff -rq dir1/ dir2/ | grep "differ"

小结

  • diff 比较文件或目录的差异
  • -u 统一格式,-y 并排显示
  • -r 递归比较目录,-q 只报告差异
  • -i 忽略大小写,-w 忽略空白
  • 可以生成补丁,用 patch 应用
  • cmp 比较二进制文件