用diff -r比较目录必须加-q或-u才有效:-rq仅报告差异存在与否,-ru输出上下文级行差异;默认输出难读、跳过二进制文件且不提示,易误判一致。

直接用 diff -r 就能看差异,但默认输出难读、易漏内容、对二进制文件静默跳过——得加参数才靠谱。
用 diff -r 时必须加 -q 或 -u 才有用
只跑 diff -r dir1 dir2 会输出大量 1c1、、<code>> 这类标记,人眼几乎无法快速定位问题。更糟的是,遇到二进制文件(比如图片、编译产物)它默认不报错也不提示,直接跳过,你以为“没输出=一致”,其实可能有几十个文件根本没比。
-
diff -rq dir1 dir2:只告诉你“哪些文件不同”或“哪个目录多了/少了文件”,适合快速扫一眼是否一致 -
diff -ru dir1 dir2:对每个同名文本文件都输出上下文差异(类似 git diff),能看清改了哪几行,但耗时明显上升 - 如果想过滤掉权限、时间戳等元数据干扰,加
-a强制当文本处理:diff -rqa dir1 dir2
忽略临时文件和缓存目录要用 --exclude
比 /var/log 或项目里的 node_modules 时,满屏 Only in dir1: app.log.20260706 是噪音,不是有效差异。
- 多个排除项可连写:
diff -rq --exclude='*.log' --exclude='__pycache__' --exclude='.git' dir1 dir2 -
--exclude只匹配文件/目录名,不支持路径通配(比如--exclude='logs/*.log'无效) - 注意单引号包裹模式,避免 shell 展开导致意外匹配
只比文件列表(不比内容)用 find + sort + comm
有时你只关心“哪些文件存在/缺失”,不 care 内容是否一样——比如验证 rsync 同步结果、检查打包完整性。这时 diff -r 多余且慢。
- 安全提取相对路径并排序:
find dir1 -type f -printf '%P\0' | sort -z > /tmp/dir1.files - 同理处理 dir2,再用
comm -3 /tmp/dir1.files /tmp/dir2.files查非共有文件 - 关键点:
%P去掉前缀路径,-z+sort -z支持含空格/换行的文件名,comm要求输入已排序 - 别用
ls或未加-printf的find,路径不统一会导致误判
脚本里判断差异成败必须看退出码,不是 stdout
写自动化检查时,很多人用 if [ -z "$(diff -rq dir1 dir2)" ],这在终端看着没问题,但一旦输出被重定向、或遇到编码异常、或临时文件残留,就可能误判。
- 正确方式:
if ! diff -rq dir1 dir2 >/dev/null; then echo "有差异"; fi -
diff退出码含义明确:0=完全一致,1=有差异,2=读取失败(如权限不足、路径不存在) - 临时文件(如用
md5sum生成的哈希表)务必rm -f清理,否则下次运行可能比错旧数据
真正容易翻车的不是命令记不住,而是默认行为——diff 不报二进制文件、find 不处理空格、comm 要求排序、临时文件不清理……这些细节不盯住,结果就不可信。











