
Linux 打包压缩实战
甲方要日志,我打了一个 zip 发过去,他打开全是乱码
Linux基础 实战课
Linux 基础实战课 · 进阶篇
————————————————
💬 有一回项目验收,甲方让把最近三个月的应用日志打包发过去。我很快,找到目录,zip -r logs.zip ./logs/,文件也不大,发了过去。
十分钟后对方回复:「打开全是乱码,文件名也都变成了问号。」——原来日志里全是中文,Windows 上 zip 默认用的 GBK 和 Linux 的 UTF-8 打架了。换个 unzip -O cp936 参数解压才搞定。
打包压缩比你想的坑多。今天把 tar 和 zip 的常见用法一次讲完,顺便避坑。
————————————————
一、tar vs zip:什么时候用哪个
工具 | 用途 | 特点 |
tar | 归档+压缩,Linux 标准格式 | 保留权限、时间戳,适合服务器间传 |
zip | 压缩,跨平台通用格式 | 丢权限,换通用性,适合发给 Windows 用户 |
💡 简单记:服务器之间传 → tar.gz;发给 Windows 电脑的人 → zip。
二、tar 核心操作(记住 5 个参数就够了)
tar 命令的规律:c=创建 x=解压 z=gzip v=显示过程 f=指定文件
tar -czf 备份.tar.gz /需要打包的目录/ | 打包+压缩 |
tar -xzf 备份.tar.gz | 解压到当前目录 |
tar -xzf 备份.tar.gz -C /目标目录/ | 解压到指定目录 |
tar -tzf 备份.tar.gz | 只看里面有什么,不解压 |
tar -czf 备份.tar.gz /目录/ --exclude='*.log' | 打包时排除 .log 文件 |
参数拆解记忆法:
● c = create 创建,x = extract 解压
● z = gzip 压缩/解压
● v = verbose 显示过程(可选,不想要输出就去掉 v)
● f = file 指定文件名(必须放最后)
● t = list 只看内容不解压
● C = 指定解压到哪个目录(大写)
⚠️ f 参数必须放最后!tar -czf 没错,tar -fcz 就会报错——f 后面跟文件名,你把 z 写在 f 后面它会把 z 当文件名。
三、zip / unzip 操作
zip -r 输出.zip 要打包的目录/ | 打包整个目录 |
unzip 文件.zip -d /目标目录/ | 解压到指定目录 |
unzip -O cp936 文件.zip | 解决 Windows 乱码(GBK→UTF-8) |
那个乱码的坑再解释一下:Windows 上生成的 zip 用 GBK 编码文件名,Linux 默认 UTF-8,直接 unzip 中文文件名就坏了。加 -O cp936 告诉 unzip「源文件是 GBK 编码」,它就能正确转换。
反过来,你在 Linux 上打包 zip 发给 Windows 用户,也要注意:
zip -r 文件.zip 目录/ | Linux 打包的 zip,Windows 自带解压通常没问题 |
四、实战场景
场景一:备份数据库文件并压缩(一条命令)
tar -czf /backup/db_$(date +%Y%m%d).tar.gz /var/lib/mysql/ | 按日期命名备份 |
场景二:把项目代码打包发给同事
tar -czf project.tar.gz ./myproject/ --exclude='node_modules' --exclude='.git' | 排除 node_modules 和 .git |
场景三:磁盘快满了,日志又大又多,只打包不压缩(快)
tar -cf logs_archive.tar /var/log/nginx/*.log-202605 | 只打包不压缩,速度快 |
场景四:解压前先看看里面有什么
tar -tzf 不确定来源的文件.tar.gz | head -20 | 先看前 20 个文件再决定要不要解压 |
⚠️ 永远不要对来源不明的 tar.gz 直接解压到根目录——可能有恶意文件覆盖系统文件。先 -tzf 看一眼内容。
五、分卷压缩:文件太大传不了怎么办
单文件超过邮件附件限制(通常 25MB),需要拆成小块:
tar -czf - /大目录/ | split -b 20M - 分卷名.tar.gz. | 拆成每个 20MB 的小文件 |
解压时先把小文件拼回去:
cat 分卷名.tar.gz.* | tar -xzf - | 拼回去再解压 |
💡 生成的文件名会是 分卷名.tar.gz.aa、分卷名.tar.gz.ab……依次拆开。要合并直接用 cat * > 拼就行。
打包压缩说到底就这些用法。tar 管 Linux 内部流转,zip 管跨平台对接。最实用的就三个:打包备份、打包传送、排除不要的文件。多敲几次肌肉记忆就形成了。
————————————————
下篇预告:《Linux 重定向与管道:命令输出的魔法,一条命令干完以前 5 步的活》
💬 你传文件给 Windows 用户的时候遇到过乱码吗?
平时用 tar 多还是 zip 多?评论区分享一下你的偏好
👍 点赞💬 留言🔄 转发给需要的朋友
有问题欢迎评论区留言,看到都会回复