Linux自带diff命令默认输出为ed编辑器指令格式(如5c5、7d6),无颜色、无上下文,可读性差;应使用-u(统一格式)、-y(并排)或colordiff(彩色高亮)提升可读性,目录比较需显式加-N、-r等参数避免遗漏。

Linux 自带 diff,无需安装就能直接用;但默认输出是黑白的、不带高亮,容易看漏差异——加 colordiff 才算真正可用。
为什么不能只用裸 diff?
原始 diff 输出靠符号(、>、c/a/d)标记变化,对长文件或结构相近的代码(比如改了几个变量名、缩进微调),人眼极易跳过关键行。尤其当两处差异相隔不远时,上下文混在一起,根本分不清哪边删哪边增。
-
diff file1.c file2.c只输出类似2c2这种编号+操作码,没颜色、没语法提示 - 忽略空格或大小写时,若未显式加
-b或-i,结果会误报大量“假差异” - 比较目录时,默认不处理子目录,
-r必须手动带上,否则静默跳过
如何快速装上 colordiff 并替代默认行为
colordiff 是 diff 的 drop-in 替代品,安装后可直接用 colordiff 命令,或 alias 成 diff 覆盖原命令。
- Debian/Ubuntu:
sudo apt install colordiff - RHEL/CentOS/Fedora:
sudo dnf install colordiff(旧版用yum) - Arch:
sudo pacman -S colordiff - 装完验证:
colordiff --version应返回版本号 - 想永久替换:
echo "alias diff=colordiff" >> ~/.bashrc && source ~/.bashrc
diff -u 是日常代码比对的实际标准格式
Git、patch、CI 日志都默认用 unified 格式(-u),它把增删行放在一起、带 3 行上下文,能一眼看出“改了什么、在哪改、周围是什么”。不用 -u 就等于放弃可读性。
- 基础用法:
diff -u a.py b.py—— 显示带上下文的差异块 - 忽略空格扰动:
diff -u -w a.py b.py(-w比-b更彻底,连制表符和空格混用都忽略) - 对比整个目录(含子目录):
diff -ur src/ src_new/——-r不可少,-u让每个文件差异都可读 - 只看哪些文件变了(不展开内容):
diff -rq dir1 dir2——-q输出简洁,适合脚本判断
真实场景中容易踩的坑
很多人卡在“明明改了却看不到差异”,或者“一堆差异根本没法定位”。核心问题往往不是命令不会用,而是没意识到输入本身有干扰。
- 文件编码不一致(如 UTF-8 vs GBK)会导致整行被标为不同,先用
file file1.txt确认编码 - 行尾换行符不同(
\r\nvs\n):加--strip-trailing-cr或用dos2unix预处理 - 路径里有软链接,
diff默认跟随,若想按链接本身比,加-P(no-dereference) -
diff -r遇到同名但类型不同的项(比如 dir1/a 是文件、dir2/a 是目录),会直接报错退出,无法跳过
最麻烦的其实是“差异存在但被过滤掉了”——比如你用了 -I '^#' 忽略注释行,结果发现配置变更没显示出来。这种隐式过滤必须写进脚本注释里,不然半年后自己都忘了为啥 diff 不报错。











