tar -d 可直接对比归档与当前文件系统差异,检查存在性、大小、时间戳、权限等;需注意路径匹配规则(默认去前导/)、输出含义及不支持直接压缩包对比。

用 tar -d 比较归档与当前文件系统
tar 自带的 -d(或 --diff、--compare)选项可直接对比归档文件和磁盘上对应路径的内容差异。它会逐个检查文件是否存在、大小是否一致、时间戳是否匹配、权限/属主是否变化等。
基本用法是:
- 归档中已有完整路径结构(如打包时用了
/etc/hosts),则运行:tar -df archive.tar—— 默认对比当前目录下同名路径 - 若归档里是相对路径(如
etc/hosts),且你想对比当前目录下的etc/目录:tar -df archive.tar etc/ - 想只看特定子项的差异,可加路径参数:
tar -df archive.tar etc/hosts etc/fstab
注意归档路径与实际路径的匹配关系
tar 在创建归档时默认会去掉绝对路径开头的 /(例如 tar -cf a.tar /etc 实际存的是 etc/)。因此用 -d 对比时,不能直接写 /etc,而要写 etc 或进入对应目录后执行。
常见做法是:
- 先进入目标目录再比对:
cd / && tar -df /path/to/archive.tar etc - 或用
-C切换上下文:tar -C / -df /path/to/archive.tar etc - 如果归档中路径含前导斜杠(加
--absolute-names打包的),才可直接按绝对路径比对,但该方式不推荐,因多数系统默认禁止
识别输出含义:什么算“不同”
执行 tar -df 后,每行输出代表一个差异项,格式类似:
etc/shadow: Size differs
var/log/syslog: Not found in archive
home/user/.bashrc: File is modified
说明:
- “Mod time differs” 表示修改时间不一致(最常见,尤其备份后文件又被更新)
- “Size differs” 表示文件体积变了,可能内容被修改或截断
- “Not found in archive” 表示本地有、归档里没有
- “File is modified” 是综合判断,通常伴随时间+大小都不同
- 无任何输出 = 归档与当前路径完全一致(精确到元数据)
配合其他选项提升实用性
单纯 -d 只报告差异,不自动修复。你可以结合以下技巧增强效果:
- 加
-v显示更详细路径和类型:tar -dvf archive.tar - 加
--force-local防止 tar 把路径误判为远程主机(极少需要) - 想快速知道有没有差异(脚本判断用):
if tar -df archive.tar >/dev/null 2>&1; then echo "一致"; else echo "有差异"; fi - 注意:
-d不支持压缩归档(如.tar.gz),必须先解压或用-z/-j等配合,例如:tar -dzf archive.tar.gz才能对比 gzip 压缩包











