直接用 tar -cJf 压缩源码最稳妥,但必须先处理路径、排除项和权限三件事:需切换父目录或用 -C 避免绝对路径污染;手动排除 .git 等目录时路径格式要准确;gzip 适合高频解压场景,xz 适合长期归档,且解压务必指定 -C 目标目录并预览校验。

直接用 tar -cJf 压缩源码最稳妥,但必须先处理路径、排除项和权限三件事,否则解压出来一堆嵌套目录或漏掉关键文件。
压缩前必须切换到父目录,避免绝对路径污染归档结构
比如项目在 /home/user/myapp,若直接运行 tar -cJf myapp.tar.xz /home/user/myapp,解压后会生成 home/user/myapp/ 而非干净的 myapp/。这是因为 tar 把绝对路径当作了归档内路径前缀。
- 正确做法是先
cd /home/user,再运行tar -cJf myapp.tar.xz myapp/ - 或者用
-C参数跳过 cd 步骤:tar -C /home/user -cJf myapp.tar.xz myapp/ - 绝对路径打包必须加
-P(大写)才不被 strip,但风险高,不推荐用于源码备份
排除 .git、node_modules 等目录要写对路径格式
tar 不读 .gitignore,也不会自动跳过常见缓存目录。手动排除时,路径写错就完全失效。
- 排除
.git:用--exclude=".git",不是--exclude=".git/"或--exclude="/home/user/myapp/.git" - 排除
node_modules:确保它在当前打包路径下,命令中写--exclude="node_modules"即可 - 多个排除项可叠加:
tar -cJf myapp.tar.xz --exclude=".git" --exclude="node_modules" --exclude="dist/" myapp/ - 通配符有效但需引号:
--exclude="*.log"可以,--exclude=*.log会被 shell 提前展开导致匹配失败
选 gzip 还是 xz?看用途别只看压缩率
源码体积不大,但解压频率可能很高——比如 CI/CD 流水线反复拉取。盲目用 xz 会导致构建变慢,尤其在 CI 机器上 CPU 有限。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 日常开发备份、CI 拉取、需要快速生成/恢复:
tar -czf myapp.tar.gz myapp/(-z= gzip) - 长期归档、发布包分发、空间敏感场景:
tar -cJf myapp.tar.xz myapp/(-J= xz) - 想提速 xz 压缩:加
--xz-options="-T0"启用多核,或--xz-options="-3"降级压缩强度(默认 -6) - 注意:旧系统可能没装
xz,tar -cJf会报command not found,先检查xz --version
解压时务必指定 -C 目标目录并验证内容
直接 tar -xf myapp.tar.xz 解压到当前目录,极易污染环境——尤其当归档里含 Makefile 或 package.json 时,可能覆盖当前工作区文件。
- 永远显式指定目标:
tar -xf myapp.tar.xz -C /tmp/myapp-restore/ - 如果归档路径太深(如
myapp-v2.1/src/main.c),加--strip-components=2跳过前两层 - 解压前先看内容:
tar -tJf myapp.tar.xz | head -n 5,确认路径结构符合预期 - 校验是否损坏:
tar -tJf myapp.tar.xz >/dev/null && echo "OK",避免解压一半失败
最容易被忽略的是:tar 默认只打包不压缩,tar -cf 出来的文件大小几乎等于源目录,很多人误以为“备份完成了”,其实只是归档,根本没省空间。真正起作用的是 -z 或 -J 参数。










