Linux tar 命令备份与压缩技巧

1次阅读

tar 默认保留绝对路径导致解压多出目录层级,应切换到父目录用相对路径或 -c 参数;gzip 适合快速备份,xz 适合长期归档;–exclude 要用引号避免 shell 展开;解压报错优先检查目标目录存在性与权限。

Linux tar 命令备份与压缩技巧

tar 压缩时文件路径意外被带进归档,解压后多出一层目录

默认 tar 会保留源路径的完整结构,比如 tar -cf backup.tar /home/user/project,解压出来就是 home/user/project/...,而不是你想要的 project/...。根本原因是 tar 把绝对路径当作了归档内路径前缀。

解决办法是切换到父目录再操作,用相对路径打包:

  • cd 到 /home/user,然后运行 tar -cf backup.tar project
  • 或用 -C 参数指定工作目录:tar -C /home/user -cf backup.tar project
  • 绝对路径必须加 -P(大写)才不会被自动 strip,但一般不推荐用绝对路径打包

gzip 和 xz 压缩率与耗时差异太大,怎么选

gzip 快、兼容性好,xz 压得更小但慢得多,尤其在老机器上可能卡住。不是“越高压缩越好”,要看场景。

实操建议按用途区分:

  • 日常备份、需要快速生成/恢复:tar -czf archive.tar.gz ...-z = gzip)
  • 长期归档、空间敏感、一次压缩多次解压:tar -cJf archive.tar.xz ...-J = xz)
  • 想控制 xz 压缩强度又怕太慢:加 --xz-options="-T0" 启用多核,或 --xz-options="-3" 降级到中等压缩比(默认是 -6)

排除特定文件或目录失败,.git 和 node_modules 还是被打包进去了

--exclude 参数对路径匹配很敏感,常见错误是没加尾部斜杠、路径写错层级、或用了绝对路径但当前工作目录不对。

正确写法要点:

  • 排除 .git 目录:用 --exclude=".git",不是 --exclude=".git/"--exclude="/path/.git"
  • 排除整个 node_modules:确保它在你要打包的目录下,且命令中路径是相对的,例如 tar -cf app.tar --exclude="node_modules" app/
  • 多个排除项可重复写:--exclude=".git" --exclude="*.log" --exclude="tmp/"
  • 注意通配符只在 tar 内部生效,shell 不展开;所以 --exclude="*.log" 是有效的,但不能写成 --exclude=*.log(缺少引号会被 shell 提前解析)

tar 解压报错 “Cannot open: No such file or Directory” 或 “Failed to set default locale”

前者通常不是归档损坏,而是目标路径不存在或权限不足;后者多见于容器或最小化系统,tar 尝试读取 locale 配置失败,但实际解压仍可能成功。

排查重点:

  • 先确认解压目标目录存在:mkdir -p /target/dir,再 tar -xf archive.tar -C /target/dir
  • 检查当前用户对目标目录是否有写权限,特别是用 sudo tar 解压到系统路径时,别漏掉 -C 后的路径权限
  • locale 报错可忽略,只要文件解出来了就行;如需彻底消除,临时设环境变量:LANG=C tar -xf archive.tar
  • 如果解压后文件时间戳全变成当前时间,说明用了 --touch 或 tar 版本有 bug,检查是否误加了该参数

事情说清了就结束

text=ZqhQzanResources