tar -czvf 用 gzip 压缩生成 .tar.gz,速度快兼容好;tar -xzvf 解压 .tar.gz;-J 对应 xz,用于 .tar.xz,压缩率高但慢且依赖多。

tar -czvf 和 tar -xzvf 的区别在哪
区别不在功能,而在底层调用的压缩工具:-z 调用 gzip,-x 后面跟 -z 就是解 gzip 压缩的 .tar.gz;-J 调用 xz,对应 .tar.xz。两者不能混用,比如 tar -czJf 会报错「invalid option -- 'J'」。
实际选型看场景:gzip 压缩快、兼容性最好(老系统、嵌入式设备基本都支持);xz 压缩率高(通常比 .tar.gz 小 20%~30%),但耗 CPU、解压慢,且部分精简版系统没预装 xz。
-
tar -czvf backup.tar.gz /var/log:适合日常备份、传输 -
tar -cJvf backup.tar.xz /var/log:适合归档长期保存、磁盘紧张时 - 别写
tar -czJf或tar -cJzf——-z和-J互斥
解压时提示 “Cannot open: No such file or directory”
这通常不是文件损坏,而是 -f 后面没跟对路径,或者当前目录下根本不存在那个包。注意:-f 必须紧接文件名,中间不能有空格,且它必须是最后一个选项或单独成项。
- 错误写法:
tar -xvzf backup.tar.gz -f(-f放错位置) - 错误写法:
tar -xvzf backup.tar.gz(末尾多一个空格,shell 可能误读) - 正确写法:
tar -xvzf backup.tar.gz(-f隐含在最后,自动取后一个参数) - 更稳妥写法:
tar -xvzf -f backup.tar.gz(显式指定,避免歧义) - 先用
ls -l backup.tar.gz确认文件存在且有读权限
如何只解压 tar 包里的某个子目录或文件
不用先全量解压再删,tar 支持按路径精确抽取。关键是路径必须和 tar -t 列出的一致——包括开头是否带 /、大小写、层级。
- 先查内容:
tar -tzf archive.tar.gz | head -10(看前10行,确认目标路径如etc/hosts) - 只解压
etc/hosts:tar -xzf archive.tar.gz etc/hosts - 只解压整个
usr/bin目录:tar -xzf archive.tar.gz usr/bin/(结尾斜杠可选,但建议加上以明确是目录) - 路径不匹配就抽不出——比如包里存的是
/usr/bin/(带根),而你写usr/bin/,就会失败
打包时跳过某些文件或目录
--exclude 是最常用也最容易写错的地方。它匹配的是打包时的「相对路径」,不是你当前所在目录的绝对路径。
- 在
/home/user/project下执行:tar -czf proj.tar.gz --exclude=node_modules --exclude=.git . - 排除规则生效前提是:这些目录/文件在
.展开后确实存在,且名字完全一致(node_modules≠Node_modules) - 多个排除项可以重复写
--exclude=xxx,也可以用--exclude-from=file.txt,每行一个模式 - 注意:
--exclude不支持通配符如*.log,只支持简单前缀匹配;要过滤扩展名,得用--exclude='*.log'(单引号包裹,防止 shell 提前展开)
真正容易被忽略的是路径上下文——tar 打包时的路径基准点,决定了 --exclude 怎么写、tar -t 看到的路径长什么样、解压时目标路径从哪开始算。不确认这点,90% 的“抽不出来”“排除不掉”问题都白调。

















