用diff比较文件应优先加-u,比较目录必须加-r;默认输出难读且静默跳过二进制文件;-u格式以---(第一参数)和+++(第二参数)标识源/目标,并带上下文精准定位变更。

直接用 diff -u file1 file2,别用裸 diff file1 file2 —— 默认输出难读、易误判,且对二进制文件静默跳过。
为什么 diff file1 file2 有时没输出,有时全是 1c1、、<code>>?
没输出 ≠ 文件相同:可能是二进制文件(diff 默认跳过),或你没权限读取某个文件。运行 file file1 确认类型;若显示 data 或 executable,加 -a 强制当文本处理。
全是一堆 1c1、、<code>> 是默认“正常格式”,它只标变更位置和方向,不带上下文:
-
2c2表示“第2行被替换”,后是第一个文件内容,<code>>后是第二个文件内容 - 顺序取决于参数:
diff a b中,属于 <code>a,>属于b - 这种格式不适合人工阅读,也不适合生成补丁
diff -u 输出里 --- 和 +++ 哪边是“原文件”?
--- 对应第一个参数(diff -u old.txt new.txt 中的 old.txt),+++ 对应第二个参数(new.txt)。但注意:diff 不预设谁该向谁对齐,这只是标记,不是修改指令。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
关键看 @@ -1,3 +1,4 @@ 这类行:
-
-1,3表示从第一个文件第1行开始取3行(即上下文) -
+1,4表示第二个文件对应位置取4行(因新增了一行) - 前面带
-的行是仅存在于第一个文件的内容,带+的是仅存在于第二个文件的内容 - 上下文默认3行,若改动密集(比如两处差1行),可能定位不准,可加大:
diff -U5 file1 file2
比较目录时,diff -r dir1 dir2 为啥只报 Only in dir1: foo.txt 却不比内容?
-r 只递归找同名文件,然后逐个比较;遇到只在一边存在的文件,就直接报 Only in,不会尝试拿一个文件去跟“不存在”比。
日常排查建议组合使用:
- 快速确认是否一致(忽略新增/缺失):
diff -rq dir1 dir2 - 要看具体哪几行不同:
diff -ru dir1 dir2(-r+-u) - 想把缺失文件也纳入差异流(例如生成完整补丁)才加
-N:diff -ruN dir1 dir2;否则-N会把大量/dev/null比较混入输出,干扰判断 - 排除临时文件:
diff -ru --exclude='*.tmp' dir1 dir2
真正容易被忽略的点是:diff 对空白、大小写、空行极其敏感,而这些差异在配置文件或脚本中往往无关紧要。别一上来就信 diff -u 的结果 —— 先想清楚你关心的是逻辑变更,还是包括缩进、换行、大小写的全部字节差异。需要过滤时,-w(忽略所有空格)、-i(忽略大小写)、-B(忽略空白行)得按需叠加,但 Python 脚本加 -w 可能让你错过缩进错误。

















