ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

tar与zip完全指南:Linux归档压缩、备份解压与实战避坑

2026/10/1 3:31:11 拓冰建站 浏览量
tar与zip完全指南:Linux归档压缩、备份解压与实战避坑 1. 打包和压缩不是一回事先把这个概念掰扯清楚我见过太多人在服务器上栽跟头就是因为在概念层面把打包和压缩混为一谈。你敲下tar -czvf的时候其实你做了两件完全不同的事情先打包再压缩。这就像搬家时先找纸箱把零碎东西归拢打包再叫一个力气大的人把纸箱搬走压缩准确说是减负。纸箱本身是为了搬运方便压缩则是在箱子和物品之间挤出更多空间。tar的全称是 Tape Archive磁带归档工具。它诞生的那个年代备份就是要写到磁带上磁带是顺序读取的存储介质你要把一堆文件连续写到磁带上就得先把它们串成一个数据流。所以tar最初根本不做压缩它只负责归档——把多个文件、目录串成一个单一文件流保留目录结构、文件权限、时间戳这些元数据。zip则不一样它天生就是把压缩作为核心能力来设计的。它的设计哲学是逐文件处理对外呈现的是一个档案容器内部每个文件都独立压缩而且每个文件还带了自己的目录项元数据。这个区别会在后面带来非常现实的差异损坏的 zip 可能还能解出其他文件损坏的 tar.gz 大概率整个数据流都废了。所以要理解这篇博文你心里要始终绷着一根弦tar做的是把一堆东西变成一个东西zip做的是把一个东西变成更小的东西。当我们说tar.gz时意思是先用 tar 变成一个东西再用 gzip 把这个东西变小。而zip则是两步合并成一步走的全能手。这篇文章面向两类读者一类是刚接触 Linux对命令参数感到恐惧的新手另一类是在生产环境吃过亏、想系统补齐这块知识体系的运维或开发。我会从基础用法讲到实操技巧再讲那些文档里不会写、但踩坑之后痛彻心扉的细节。2. tar 命令的完整拆解从归档到压缩的进阶路径2.1 最常用的命令形态五分钟记住 tar 的参数逻辑tar的参数看起来像天书其实核心就几个字母记住它们是怎么组合的你就能摆脱死记硬背。最经典的一条tar -czvf website_backup.tar.gz /var/www/html拆解一下ccreate创建归档。z用 gzip 压缩。vverbose显示过程不打这个参数你会觉得命令卡死了。ff 后面紧跟的是归档文件名这是 tar 唯一一个后面必须跟参数的选项。这几个字母可以换顺序写tar -zcvf和tar -czvf等价但f必须是最后一个因为它后面要跟文件名。这个规则我当年是在面试题里被坑了才记住的现在写出来希望你能一次记牢。对应地解包命令tar -xzvf website_backup.tar.gzxextract解包。如果你要解压到指定目录加-C参数tar -xzvf website_backup.tar.gz -C /opt/restored-C是--directory的缩写指定解压目标目录。注意目标目录最好提前建好虽然某些版本的 tar 会在已有目录内自动创建路径但-C后面的路径如果根本不存在会直接报错。刚入门的人最常犯的错误是漏掉-f后面那个文件名或者把文件名写到了-C的参数位置导致 Not found in archive 之类的报错。记住-f后面的路径是归档文件自身-C后面的路径是解压落地的地方。2.2 三种压缩算法的选型性能与体积的博弈tar 本身不压缩但我们可以给它配套不同的压缩工具常见三种算法命令参数特点适用场景gzip-z速度中压缩率中等最通用日常备份、日志归档bzip2-j压缩率更高速度更慢追求体积最小化xz-J压缩率最高速度最慢内存占用大离线存档、软件包发布实测经验一个 2GB 的日志目录gzip 压缩后大约 400MB耗时约 1 分半xz 压缩后大约 200MB耗时接近 6 分钟。所以选型前先问自己这个归档是要长期保存在磁盘上还是每天晚上备份一次然后丢到对象存储里如果是后者时间成本往往比那几十 MB 的容量更有价值。还有一个不太被注意的点压缩级别。gzip 默认级别是 6范围是 1-9。级别 9 也不是不能用的但收益递减严重。我的经验是日志类文本用-1或-9差别确实存在但对于已经压缩过的图片、视频、PDF 等文件再压缩基本是白费 CPU 时间因为那些格式内部已经做过压缩了。2.3 只看结构不解压查看归档内容的正确姿势拿到一个 tar 包不要急于解压。先看看里面是什么用tar -tvf backup.tar.gzt就是 list列出内容。这个命令会显示每个文件的权限、所有者、大小和时间戳。为什么先看两个原因第一防止压缩包内带了绝对路径文件解压时直接覆盖到根目录的对应位置这个事故我在 2.5 节会详细讲第二确认内容和备份预期一致防止备份脚本出问题但你没发现。另外一个冷门但很有用的技巧只看某个具体文件是否存在tar -tf backup.tar.gz | grep config/nginx.conf2.4 增量备份与排除目录tar 的高级玩法tar不是只能全量打包。我经常用它的排除功能来处理那些不需要归档的目录比如缓存、临时文件、日志目录tar -czvf app_backup.tar.gz --exclude/var/www/html/cache --exclude*.log /var/www/html一次性排除多个目录可以接多个--exclude参数。注意参数顺序有个坑--exclude必须写在源路径之前否则部分 tar 版本不认。增量备份的概念也很实用。tar 支持-g参数配合快照文件实现增量归档tar -czvf monthly_backup.tar.gz -g snapshot.txt /var/www/html tar -czvf daily_backup.tar.gz -g snapshot.txt /var/www/html第一次运行会创建完整备份并写入快照第二次运行只打包自上次以来新增或修改的文件。这套方案比全量备份节省大量空间和时间比起专业的备份工具胜在纯命令行即可完成适合在嵌入式环境或没有备份 agent 的服务器上快速实现。2.5 解包时的路径安全绝对路径和目录穿越的隐患这是我认为所有 tar 使用者都必须知道的重点。当你看到一个归档文件内部路径是这样的/etc/passwd /home/user/.bashrc而你还用了未经检查的一键解压这些文件会直接覆盖你系统上的对应文件。这可能是别人恶意构造的归档也可能是某台机器备份时误用了绝对路径导致的。安全解压的标准做法是先tar -tf看内容再决定解压方案。还有一种做法用--strip-components去掉归档内的路径前缀tar -xzvf backup.tar.gz --strip-components3这个3表示去掉路径的前 3 层目录。比如归档内路径是home/user/www/backup/2023/index.html去掉前 3 层后解压出来的就是backup/2023/index.html。这个参数在解压别人给的归档、又不想被它的目录结构牵着鼻子走的时候非常有用。如果归档内确实有目录穿越../风险现代 tar 会给出警告并剔除但不同版本行为不同。我强烈建议从互联网下到的 tar 包永远先列出内容再看是否要解压。这一步只花十秒却可能省下一天。3. zip 命令的完整拆解跨平台压缩的标准选择3.1 zip 与 unzip 的基本用法和 tar 完全不同的哲学zip的命令格式是zip -r archive.zip /path/to/dir-r是递归处理目录时必须加。它不像 tar 那样需要指定归档名参数而是第一个参数就是归档文件名后面跟源文件。解压用unzip archive.zip看内容unzip -l archive.zipzip 的一个巨大优势是跨平台Windows 的资源管理器原生支持 zip 解压macOS 双击也能解Linux 上则是标配。如果你想给别人发一个拿到就能用的压缩包zip 是默认选择。而 tar.gz 在 Windows 上需要额外装软件这就是我之前说选型取决于场景的原因。3.2 zip 的密码加密与伪加密陷阱zip支持密码加密这个功能很多人用过zip -P secret123 -r secret.zip /path/to/data但这里有个巨大的坑zip 的加密安全等级分为 ZipCrypto 和 AES-256。传统 ZipCrypto 算法弱到可以暴力破解或已知明文攻击而且它是 ZipCrypto 的话很多工具可以绕过密码直接读文件名清单。更麻烦的是伪加密某些工具生成的 zip 只是把加密标志位设了实际数据根本没加密。网上流传的各种秒破 zip 密码工具本质就是识别出伪加密后直接清除标志位并不是真的破解了强加密。所以我的建议是涉及重要数据别用默认的 zip 加密。大版本 unzip 支持 AES但 Windows 自带的 zip 功能不支持 AES 解压。如果你要给跨平台用户提供加密压缩包最好用 7-Zip 创建 zip 并指定 AES-256 加密同时确认接收方的解压工具支持。如果你拿到一个加密 zip 忘了密码先试试伪加密检测zipinfo -v secret.zip看加密方式字段和实际数据状态。确认真加密且密码遗忘那只能暴力破解尤其当密码长度超过八位且混合了数字字母符号时基本可以放弃常规破解这不是命令技巧能解决的问题。3.3 zip 分卷压缩突破单文件大小限制给 Windows 用户发大文件U 盘是 FAT32 格式的单文件不能超过 4GB这时候分卷 zip 就派上用场了zip -s 2g -r large_archive.zip /path/to/bigdata-s指定分卷大小2g 表示 2GB 一卷。生成的会是large_archive.zip、large_archive.z01、large_archive.z02这样一串文件。接收方把全部文件放同一个目录然后解压第一个主文件即可。3.4 zip 的文件名编码问题中文乱码的终极解药这是个让无数人崩溃的痛点在 Linux 上用 zip 打包的中文文件名发给 Windows 用户解压出来全是乱码反过来也一样。原因很简单zip 格式早期没有统一的文件名编码标准Windows 用 GBKLinux 用 UTF-8写进包里的编码不一样解压方却用另一套去解读。在 Linux 上解压别人发来的中文名 zipunzip -O GBK archive.zip这条命令强制让 unzip 以 GBK 编码去解码文件名。另外发 zip 给别人时如果对方是 Windows在 Linux 上可以考虑用 7z 创建 zip它默认尝试 UTF-8 文件名存储。这个问题到现在也不能说 100% 干净但-O参数确实解决了大多数中文乱码场景。3.5 用 zip 实现免解压文件预览效率提升的小技巧unzip -p很有意思它可以直接把压缩包内某个文件的内容输出到标准输出不需要在磁盘上落地解压unzip -p data.zip config.json | jq .version我经常用这条命令快速查看部署包里的配置信息不用每次解压完再打开文件方便多了。同样可以把多个日志文件从远程机器拉回来先这样预览再决定要不要完整解压。4. 实战综合应用场景与踩坑记录4.1 服务器迁移时的高效备份流程假设你要把一台跑着多个网站的服务器做完整迁移。目标机器是新装的 Linux源机器上有 Nginx、MySQL、应用代码和静态资源。我的做法分三步第一步先打包排除了缓存和大日志tar -czvf /tmp/nginx_site_backup.tar.gz --exclude*/logs/* --exclude*/cache/* /etc/nginx /var/www第二步数据库单独用逻辑导出再压缩这一步不是 tar 的任务但我会在同一脚本里完成mysqldump -u root -p --all-databases | gzip /tmp/mysql_all_$(date %F).sql.gz第三步把所有归档传送到目标机器解压到临时目录核对关键配置文件tar -xzvf nginx_site_backup.tar.gz -C /tmp/migration_check tar -tf nginx_site_backup.tar.gz | grep nginx.conf整个流程的核心是不直接在生产环境上动手的原则。解压先落到临时目录检查没问题再复制到正式位置。有些新手把解压结果直接覆盖到目标服务器的正式配置目录容易搞得一团糟实在没必要。4.2 网上下载的源码包解压后的放置策略从 GitHub 下源码包常见后缀是v1.0.tar.gz或archive.zip。我最常用的命令组合是mkdir -p /tmp/source_build tar -xzvf project_v1.0.tar.gz -C /tmp/source_build cd /tmp/source_build/project_v1.0这里用-C把解压内容单独放进构建目录避免直接在~/Downloads里解压然后找不到位置。下载的 zip 如果带了很多顶层目录unzip project_assets.zip -d /tmp/project_assets注意-d指定解压目录这个参数和 tar 的-C作用类似。4.3 大文件传输场景tar 管道与 xargs 的高阶配合在服务器之间传输整个目录我常常不落盘直接用管道配合 ssh 完成tar -czvf - /var/www/html | ssh user192.168.1.100 cat /opt/incoming/site_$(date %F).tar.gz-表示标准输入输出。tar把结果输出到 stdoutssh在远端把数据流接收到文件里。这样避免了在本机先生成一个超大备份文件占满磁盘再传输再删的尴尬。这个思路换成远程直接解压也成立tar -czvf - /var/www/html | ssh user192.168.1.100 tar -xzvf - -C /opt/restored远端直接展开全程没有中间文件。如果你有一堆日志文件要归档到数据库节点或者对象存储也可以用这个管道模式配合 xargs 做并发处理。tar -tf结合xargs可以批量处理包内文件比如批量检查一个归档里几百个文件是否包含关键错误关键字。4.4 前一天还好好的今天突然解压报错的故事有一次我遇到一件怪事NAS 上存放多年的备份包突然无法解压。报错信息是gzip: stdin: unexpected end of file。这是典型的归档数据不完整原因极可能是当年生成归档时磁盘空间不足gzip 完成前写了一半就停了也可能是磁道损坏或者拷贝过程中中断。这类故事的经验教训有两条第一重要备份永远要校验。生成 tar 包后记录它的 SHA256sha256sum site_backup.tar.gz site_backup.tar.gz.sha256第二定期做恢复演练。我在每个季度会随机抽取一次备份在测试环境完整解压确认项目里的文件能正常读取。备份的价值不在备份动作本身而在恢复结果。一个解不开的备份和垃圾数据没有区别。4.5 权限与属主解压后权限不对的经典场景在 Linux 上解压 tar 包后你可能会发现文件属主是数字和字符串类似1000:1000或者在 NFS 共享目录下解压后权限错乱。原因在于 tar 归档会保存 uid/gid解压时如果目标系统没有对应账户就采用原数值如果环境不同则可能出现错位。这种场景下解压后修复权限比预先把所有权锚定到固定 uid 更靠谱。常用的一条修复命令chown -R www-data:www-data /var/www/html如果是 zip 包更麻烦zip 格式里面保存的基本只有低精度权限位。跨系统解压后有些文件可能没了可执行权限导致脚本不能跑。我的惯例是脚本类文件解压后逐个检查执行位chmod x /opt/scripts/*.sh这个问题做桌面系统的人可能不敏感但做运维的人一定深有体会。5. 从细节里省时间运维视角下的压缩优化技巧5.1 不要压缩已经压缩过的文件视频mp4、mkv、图片jpg、png、音频mp3这些格式内部已经做过压缩。你再塞进 tar.gz 里gzip 对它们基本无能为力只会白白消耗 CPU 时间。一个可执行的优化用tar -tf先扫描归档内容评估哪些文件可以被排除或用不同归档策略处理。例如一个目录里既有几 GB 的 jpg 又有少量日志我会把日志单独打包压缩jpg 直接 tar 不压缩tar -cvf images_and_logs.tar --exclude*.log /path/to/media tar -czvf logs_only.tar.gz /path/to/logs如果整个目录都是多媒体文件干脆用 tar 不压缩或者用 zip 的存储模式0 级压缩zip -0 -r media_archive.zip /path/to/media-0表示仅存储不压缩速度飞快。5.2 用 pigz 和 pbzip2 挤掉压缩耗时单线程的 gzip 在处理大目录时是性能瓶颈尤其现在服务器动辄十几核却看着一个核在跑、其他核闲着太浪费了。pigz是 gzip 的多线程版本用法几乎一样pigz -c backup.tar backup.tar.gz或者直接让 tar 调用它tar -cvf - /var/www/html | pigz -p 4 backup.tar.gz-p指定线程数。实测压缩一个 10GB 目录gzip 用时 3 分钟pigz 四线程直接压进 1 分钟以内。解压同理unpigz对应解压命令。如果你在 Debian/Ubuntu 上安装就是apt install pigz一句话的事。5.3 查看压缩包内容的体积排行拿到一个巨大 tar 包别急着全部解压可以先看哪些文件占的空间大精确定位tar -tvf big_archive.tar.gz | sort -k3 -n | tail -20这条命令按大小排序列出占空间最大的 20 个文件。探明体积后你就可以决定是全部落地还是只挑里面的关键部分压缩。对应地zip 包unzip -l big_archive.zip | sort -k1 -n | tail -205.4 tar 在管道中的特殊用法只解压需要的单个文件很多场景只要你取归档里的一两个文件比如从旧的备份里恢复一个配置文件不需要把几十 GB 全部解开。这时可以用通配符指定要提取的文件tar -xzvf big_backup.tar.gz etc/nginx/nginx.conf注意脚本中的匹配模式要跟归档内的路径完全一致最好先tar -tf确认路径写法。这个技能在面对超大型归档时能节省几十分钟值得掌握。5.5 归档前的检查用 tar 自带的校验保证数据完整tar里能够验证归档文件在压缩前是否存在问题配合 gzip 的完整性检查一起用gzip -t backup.tar.gzgzip -t测试压缩文件是否完好返回正常的话就说明数据流完整。直观理解它不关心内容逻辑但能检查压缩流损坏与否。异曲同工的还有tar -tzf backup.tar.gz它会读取整个归档、列出内容如果中途遇到 CRC 错误或截断就会报错。日常备份流程里我可以把这条校验命令直接接在备份命令后面做成一个快速自检tar -czvf backup_$(date %F).tar.gz /data tar -tzf backup_$(date %F).tar.gz /dev/null echo Backup OK6. 常用参数速查表贴在手边的备忘录写到最后把最常用的参数整理成表。这张表我自己的服务器上~/cheatsheet/tar_zip.md就存了一份方便随时翻。6.1 tar 参数速查参数作用最常用搭配-c创建归档-czvf-x解压归档-xzvf-t列出内容-tf-v显示过程随意-f指定归档文件名必须-zgzip 压缩/解压-czvf-jbzip2 压缩/解压-cjvf-Jxz 压缩/解压-cJvf-C指定目录解压时常用--exclude排除文件/目录备份时常用--strip-components移除路径层级意外收获记忆锚点c 是 createx 是 extractt 是 listf 后面跟文件u 是 updater 是 append。6.2 zip 参数速查参数作用-r递归压缩目录-e加密压缩包会交互式要求输入密码-P直接指定密码-s分卷大小-0仅存储不压缩-9最大压缩率-d解压到指定目录-l列出内容-O以指定编码解压文件名记忆锚点zip 第一个参数是动作默认压缩时直接zip 包名 源文件unzip 则参数更少-d指定落盘位置。6.3 其他值得知道的相关工具7z高压缩率支持 AES-256 加密对 zip 兼容性最好。xz、bzip2tar 的黄金搭档压缩率与速度各有侧重。rsync ssh传输同步目录时比先打包再传输更省心配合--compress选项能做到边传边压缩。dd gzip整块磁盘的备份用dd if/dev/sda | gzip disk.img.gz。我个人的最终建议是日常一定要分清我要打包归档和我要压缩传输这两个诉求。备份和迁移选 tar跨平台交换和配合 Windows 用户选 zip必要时加-e加密。不管哪个工具建立归档后必须验证的习惯比背下所有参数都重要。毕竟一个无法恢复的备份才是运维路上最贵的一课。