马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、先分清:ZIP 和"压缩"不是一回事
Zip 是最广泛使用的归档文件格式,支持无损数据压缩。理解"归档"和"压缩"两个概念,用起来才不迷糊:
- 归档:把一个或多个文件、目录打包进一个容器(zip 文件),之后可以提取还原成原始文件。
- 压缩:在归档的基础上做无损压缩,减小体积。
Zip 文件不存储所有权(owner)信息,提取出来的文件归运行该命令的用户所有。这一点很重要:你对要提取的目标目录必须有写权限,否则 unzip 会失败。
Zip 还提供了一系列高级功能,比如给归档加密码保护、把大文件拆成更小的分卷便于管理。本文聚焦在 Linux 下用 unzip 解压这个动作本身。
二、安装 unzip
unzip 在大多数 Linux 发行版中默认没装,但用发行版的包管理器装一下就好。
Ubuntu / Debian
sudo apt install unzip
CentOS / Fedora
sudo yum install unzip
装完验证:unzip -v。顺带一句,要对目录做 zip 打包,装的是 zip 包而不是 unzip,两者是一对。
三、最基础的解压
在最简单的形式下,不带任何选项运行 unzip,它会把指定 zip 归档里的所有文件提取到当前目录。
unzip latest.zip
比如你下载了 WordPress 安装包的 zip,要解压到当前目录,就跑上面这一条。
[root@host data]# ls
latest.zip
[root@host data]# unzip latest.zip
Archive: latest.zip
creating: wordpress/
inflating: wordpress/xmlrpc.php
inflating: wordpress/wp-blog-header.php
...
[root@host data]# ls
latest.zip wordpress/
四、六个高频选项
1. -q:静默模式
默认情况下 unzip 会打印它正在提取的所有文件名,而且提取完成后还会给一个摘要。想屏蔽这些消息,用 -q:
unzip -q filename.zip
适合在脚本里用——输出干净,方便后面自己处理。
2. -d:解压到指定目录
想把内容释放到除当前工作目录以外的目录,用 -d 指定目标路径:
unzip filename.zip -d /path/to/directory
比如把 WordPress 归档 latest.zip 解压到 /var/www/:
sudo unzip latest.zip -d /var/www
这里为什么用 sudo?因为你登录的用户通常对 /var/www 没有写权限。但要记住:用 sudo 解压后,提取的文件和目录的所有者就是 root 了——如果/var/www 下面要跑的是 Web 服务(比如 nginx、php-fpm 以 www-data 身份运行),记得事后 chown 回正确属主,否则访问会报权限错误。
sudo chown -R www-data:www-data /var/www/wordpress
3. -l:只列内容不解压
解压前先看看里面有什么,用 -l:
unzip -l filename.zip
Archive: latest.zip
Length Date Name
--------- --------- -------------------------
0 2023-08-02 22:39 wordpress/
3065 2021-08-31 18:31 wordpress/xmlrpc.php
364 2021-12-19 12:20 wordpress/wp-blog-header.php
21323 2023-03-09 01:15 wordpress/wp-admin/themes.php
--------- -------
2727140 1648 files
远传一个大包之前先 unzip -l 看一眼,能避免传错包、包结构不对这类低级事故。
4. -x:解压时排除某些文件
要排除特定文件或目录,用 -x,后面跟要从提取中排除的归档内文件列表,空格分隔:
unzip filename.zip -x 要排除的文件1 要排除的文件2
比如从 zip 里提取所有内容,但排除 .git 目录:
unzip filename.zip -x "*.git/*"
关键点:-x 匹配的是"归档内部路径",不是磁盘路径;通配符要用引号包起来,否则 shell 会先按当前目录的文件去展开,匹配永远落空。排除一批缓存目录就写 -x "*.git/*" "*.svn/*" "*.log"。
5. 覆盖控制的两个开关:-o 与 -n
假设你先前已解压过一次,现在又跑一遍同样的命令,默认 unzip 会交互式地问你:只覆盖当前文件、覆盖全部、跳过当前、跳过全部,还是重命名。
Archive: latest.zip
replace wordpress/xmlrpc.php? [y]es, [n]o, [A]ll, [N]one, [r]ename:
两条自动化常用答案:
unzip -o filename.zip # 不提示,直接覆盖已有文件
unzip -n filename.zip # 不提示,已存在的直接跳过
-o 要谨慎:之前对文件做的任何修改都会丢失(因为它无条件覆盖)。
-n 的用武之地很典型:你已经解压并改过其中一些文件,现在误删了几个想从包里恢复,同时又要保住自己的改动——用 -n 就能只补回缺失的、不动已存在的。
6. -P:解压带密码的归档(以及为什么不该用)
受密码保护的 zip 用 -P 指定密码:
unzip -P 密码 filename.zip
在命令行里明文输入密码是不安全的,应该避免。更稳妥的做法是什么都不加,让 unzip interactive 地提示你:
unzip filename.zip
Archive: filename.zip
[filename.zip] file.txt password:
密码正确后,归档中所有加密文件会使用同一个密码,逐个提示只出现一次。
补充一句:-P 的密码会出现在 ps aux 的输出里,同机其他用户按 ps 就能看到,所以共享机器上一律别用 -P。
五、一次解压多个 zip
用正则表达式匹配多个归档。当前目录有多个 zip 时,一条命令搞定:
unzip '*.zip'
请注意 *.zip 周围的单引号必须加。忘记加引号,shell 会先把通配符展开成实际文件列表传给 unzip,结果往往报 zipfile is not a zip file 之类的错。
六、选项速查表
| 选项 | 作用 | 示例 |
-q | 静默,不打印提取过程 | unzip -q f.zip |
-d | 解压到指定目录 | unzip f.zip -d /var/www |
-l | 只列出归档内容 | unzip -l f.zip |
-x | 排除指定文件 | unzip f.zip -x "*.git/*" |
-o | 无提示覆盖 | unzip -o f.zip |
-n | 已存在则跳过(保住自己的改动) | unzip -n f.zip |
-P | 指定解压密码(不安全,慎用) | unzip -P pwd f.zip |
-t | 只测试归档完整性,不提取 | unzip -t f.zip |
七、其他压缩格式对照
unzip 只管 zip。碰到别的格式换对应的工具:
| 格式 | 解压 | 打包 |
.zip | unzip | zip -r a.zip dir/ |
.tar.gz / .tgz | tar -xzf a.tar.gz | tar -czf a.tar.gz dir/ |
.tar.bz2 | tar -xjf a.tar.bz2 | tar -cjf a.tar.bz2 dir/ |
.tar.xz | tar -xJf a.tar.xz | tar -cJf a.tar.xz dir/ |
.gz(单文件) | gzip -d a.gz | gzip a |
.rar | unrar x / 7z x | 7z a |
最常记混的是 tar 那组字母:z 是 gzip、j 是 bzip2、J 是大写 J 是 xz;x 解包、c 打包;f 必须放最后、后面跟文件名。
小结
unzip 是一个命令行工具,能列出、测试和提取压缩的 zip 归档文件。日常记住四条:
- 基础:
unzip 包.zip 解到当前目录;换目录加 -d /目标路径(用 sudo 后记得 chown 回服务账号);
- 先看看:
unzip -l 列内容、unzip -t 测完整性;
- 覆盖策略:
-o 强覆盖(会丢修改)、-n 跳过已有(适合补回误删);
- 坑位:
-x "*.git/*" 的路径是归档内路径且必须加引号;unzip '*.zip' 的多文件也必须用单引号,否则 shell 先展开就报错。
碰到非 zip 格式,按上面那张表换 tar / gzip 对应命令即可。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:示例基于 GNU unzip / Info-ZIP,适用于 Ubuntu、Debian、CentOS 等主流 Linux 发行版。) |