diff 命令用于比较两个文件或目录的差异,逐行比较文本文件的内容。它是程序开发、版本控制和系统管理中必不可少的工具。
diff [选项] 文件1 文件2
比较目录:
diff [选项] 目录1 目录2
1,2c1,2
< 第一行原始内容
< 第二行原始内容
---
> 第一行新内容
> 第二行新内容
说明:c表示修改,a表示添加,d表示删除
--- file1.txt 2024-01-10 10:00:00
+++ file2.txt 2024-01-10 11:00:00
@@ -1,3 +1,3 @@
相同的第一行
-被删除的第二行
+新添加的第二行
相同的第三行
说明:-表示删除的行,+表示添加的行
*** file1.txt 2024-01-10 10:00:00
--- file2.txt 2024-01-10 11:00:00
***************
*** 1,3 ****
相同的第一行
! 被删除的第二行
相同的第三行
--- 1,3 ----
相同的第一行
! 新添加的第二行
相同的第三行
说明:!表示修改的行
# 创建测试文件
echo -e "line1\nline2\nline3" > file1.txt
echo -e "line1\nmodified_line\nline3" > file2.txt
# 比较两个文件
diff file1.txt file2.txt
# 输出:
# 2c2
# < line2
# ---
# > modified_line
# 使用统一格式(最易读)
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
# 递归比较两个目录
diff -r dir1/ dir2/
# 只报告哪些文件不同
diff -rq dir1/ dir2/
# 忽略某些文件类型
diff -r --exclude="*.log" dir1/ dir2/
# 忽略空白字符数量的变化
diff -b file1.txt file2.txt
# 忽略所有空白字符
diff -w file1.txt file2.txt
# 忽略空行变化
diff -B file1.txt file2.txt
# 比较两个版本的代码文件
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
# 备份配置文件
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
# 比较不同时间点的日志
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
# 比较开发环境和生产环境的代码
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
# 为整个目录生成补丁
diff -Nur old_directory/ new_directory/ > changes.patch
# 查看补丁文件
cat changes.patch
# 应用补丁
patch -p1 < changes.patch
# 比较两个目录中所有.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
# 忽略版本号差异
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
# 使用vimdiff进行可视化比较
vimdiff file1.txt file2.txt
# 使用colordiff获得彩色输出
diff -u file1.txt file2.txt | colordiff
# 并排比较(需要安装其他工具)
diff -y file1.txt file2.txt
-N选项可以正确处理新增/删除的文件-r选项比较目录时,会递归比较所有子目录