linux diff命令

命令简介

diff 命令用于比较两个文件或目录的差异,逐行比较文本文件的内容。它是程序开发、版本控制和系统管理中必不可少的工具。

语法

diff [选项] 文件1 文件2

比较目录:

diff [选项] 目录1 目录2

常用选项

选项 说明
-q 只报告文件是否不同,不显示具体差异
-s 报告两个文件相同
-c 使用上下文格式输出
-u 使用统一格式输出(最常用)
-i 忽略大小写差异
-w 忽略所有空白字符
-b 忽略空白字符数量的变化
-B 忽略空行变化
-r 递归比较目录
-N 将不存在的文件视为空文件

输出格式说明

1. 普通格式
1,2c1,2
< 第一行原始内容
< 第二行原始内容
---
> 第一行新内容
> 第二行新内容

说明:c表示修改,a表示添加,d表示删除

2. 统一格式(-u)
--- file1.txt  2024-01-10 10:00:00
+++ file2.txt  2024-01-10 11:00:00
@@ -1,3 +1,3 @@
 相同的第一行
-被删除的第二行
+新添加的第二行
 相同的第三行

说明:-表示删除的行,+表示添加的行

3. 上下文格式(-c)
*** file1.txt  2024-01-10 10:00:00
--- file2.txt  2024-01-10 11:00:00
***************
*** 1,3 ****
  相同的第一行
! 被删除的第二行
  相同的第三行
--- 1,3 ----
  相同的第一行
! 新添加的第二行
  相同的第三行

说明:!表示修改的行

基本用法

1. 基本文件比较
# 创建测试文件
echo -e "line1\nline2\nline3" > file1.txt
echo -e "line1\nmodified_line\nline3" > file2.txt

# 比较两个文件
diff file1.txt file2.txt
# 输出:
# 2c2
# < line2
# ---
# > modified_line
2. 统一格式输出
# 使用统一格式(最易读)
diff -u file1.txt file2.txt

# 输出:
# --- file1.txt  2024-01-10 10:00:00
# +++ file2.txt  2024-01-10 10:00:00
# @@ -1,3 +1,3 @@
#  line1
# -line2
# +modified_line
#  line3
3. 目录比较
# 递归比较两个目录
diff -r dir1/ dir2/

# 只报告哪些文件不同
diff -rq dir1/ dir2/

# 忽略某些文件类型
diff -r --exclude="*.log" dir1/ dir2/
4. 忽略空白差异
# 忽略空白字符数量的变化
diff -b file1.txt file2.txt

# 忽略所有空白字符
diff -w file1.txt file2.txt

# 忽略空行变化
diff -B file1.txt file2.txt

实际应用场景

场景1:代码版本比较
# 比较两个版本的代码文件
diff -u program_v1.py program_v2.py

# 生成补丁文件
diff -u program_v1.py program_v2.py > patch_file.diff

# 应用补丁
patch program_v1.py < patch_file.diff
场景2:配置文件比较
# 备份配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

# 修改配置后比较差异
diff -u /etc/nginx/nginx.conf.backup /etc/nginx/nginx.conf

# 忽略注释行的差异
diff -I '^#' nginx_old.conf nginx_new.conf
场景3:日志文件分析
# 比较不同时间点的日志
diff log_jan10.txt log_jan11.txt

# 只显示有差异的文件
diff -q /var/log/old/ /var/log/new/

# 比较日志文件,忽略时间戳
diff -I '^[A-Z][a-z]{2} [0-9]{2}' access_log1 access_log2
场景4:项目部署验证
# 比较开发环境和生产环境的代码
diff -r --exclude=".git" --exclude="*.log" /path/to/dev/ /path/to/prod/

# 使用颜色输出(如果支持)
diff --color=auto -u file1.txt file2.txt

# 生成详细的差异报告
diff -urN dev_dir/ prod_dir/ > deployment_diff.txt

高级用法

1. 生成补丁文件
# 为整个目录生成补丁
diff -Nur old_directory/ new_directory/ > changes.patch

# 查看补丁文件
cat changes.patch

# 应用补丁
patch -p1 < changes.patch
2. 与find命令结合使用
# 比较两个目录中所有.txt文件的差异
find dir1/ -name "*.txt" -exec bash -c 'file1=$1; file2=dir2/${1#dir1/}; [[ -f $file2 ]] && diff -q "$file1" "$file2"' _ {} \;

# 找出两个目录中内容不同的文件
diff -rq dir1/ dir2/ | grep differ
3. 忽略特定模式的差异
# 忽略版本号差异
diff -I '[vV]ersion:.*' file1.txt file2.txt

# 忽略日期时间差异
diff -I '[0-9]{4}-[0-9]{2}-[0-9]{2}' log1.txt log2.txt

# 忽略多个模式
diff -I '^#' -I '^//' config1.txt config2.txt
4. 边比较边查看
# 使用vimdiff进行可视化比较
vimdiff file1.txt file2.txt

# 使用colordiff获得彩色输出
diff -u file1.txt file2.txt | colordiff

# 并排比较(需要安装其他工具)
diff -y file1.txt file2.txt

注意事项

  • diff命令对二进制文件的比较可能不准确
  • 比较目录时,使用-N选项可以正确处理新增/删除的文件
  • 统一格式(-u)是最易读的输出格式,推荐使用
  • 对于大型文件,diff可能消耗较多内存
  • diff的输出可以作为patch命令的输入来应用更改
  • 使用-r选项比较目录时,会递归比较所有子目录