diff - 比较文件和目录差异

diff 按行比较文本文件,也可以比较两个目录中对应文件的差异。

基本语法

diff [OPTIONS...] FILES

diff 没有发现差异时退出状态为 0,发现差异时为 1,发生错误时为 2

常用参数

  • -u--unified:输出统一格式,适合阅读和生成补丁。
  • -c--context:输出上下文格式。
  • -y--side-by-side:并排显示。
  • -W COLUMNS--width=COLUMNS:设置并排输出宽度。
  • --suppress-common-lines:并排模式中不显示相同行。
  • -i--ignore-case:忽略大小写。
  • -b--ignore-space-change:忽略空白数量变化。
  • -w--ignore-all-space:忽略全部空白。
  • -B--ignore-blank-lines:忽略全空白行变化。
  • -r--recursive:递归比较目录。
  • -x PATTERN--exclude=PATTERN:排除匹配的文件或目录。
  • -X FILE--exclude-from=FILE:从文件读取排除模式。

比较文件

# 默认格式
diff before.txt after.txt
 
# 统一格式
diff -u before.txt after.txt
 
# 并排显示,只看不同的行
diff -y --suppress-common-lines before.txt after.txt

生成补丁文件:

diff -u before.txt after.txt > change.patch

应用补丁前应先检查内容,并保留原文件或版本控制记录。

比较目录

# 递归比较两个目录
diff -r directory_a directory_b
 
# 排除缓存目录
diff -r -x '.cache' directory_a directory_b

-b-w

  • -b 忽略空白数量的变化,例如一个空格和多个空格。
  • -w 忽略全部空白差异,因此 a bab 也会被视为相同。

当空白具有语义时,例如 Python 缩进或模板内容,不应使用这些选项隐藏差异。

与 cmp 的区别

  • diff 主要按行比较文本,适合阅读内容变化和生成补丁。
  • cmp 按字节比较,适合快速判断两个文件是否完全一致。

参考资料