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 file1.bin file2.bin
cmp -l file1.bin file2.bin
-l 显示所有不同的字节。
sdiff 是 diff -y 的增强版:
sdiff file1.txt file2.txt
sdiff -s file1.txt file2.txt
-s 不显示相同的行。
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"
-u 统一格式,-y 并排显示-r 递归比较目录,-q 只报告差异-i 忽略大小写,-w 忽略空白