前言

本文主要讲解在Linux上怎么将文件压缩成zip包,及解压缩zip包。

zip命令 可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。
通过 zip 命令可以将文件打包成.zip格式的压缩包,里面会附含文件的名称、路径、创建时间、上次修改时间等等信息,与 tar 命令相似。

一、linux安装zip文件

1.查看是否安装压缩/解压zip软件包

yum list installed | grep zip

在这里插入图片描述
2.输入以下命令来安装zip/unzip软件:

以下两种方式任选其一

方式一:
sudo apt-get install zip unzip

方式二:
yum -y install zip unzip

3.扩展命令 安装 卸载 更新

命令1:yum -y install [关键词]
命令2:yum -y remove [关键词]
命令3:yum -y update [关键词]

二、zip语法

该命令的语法如下:

zip [选项] 压缩包名 源文件或源目录列表

常用命令选项

-a, --ascii将文件转换为 ASCII 格式
-A, --adjust-sfx调整自解压可执行归档文件。通过将 SFX 存根添加到现有存档中首部,可以创建自解压缩的可执行存档
-b, --temp-path PATH指定暂时 zip 文件的目录
-c, --entry-comments为每一个被压缩的文件加上一行注释说明
-d, --delete删除压缩文件内指定的文件。例如 zip -d foo foo/tom/junk foo/harry/\* \*.o,将移除文件 foo/tom/junk以及所有以 foo/harry/ 开头的文件以及后缀为 .o 的文件
-db, --display-bytes显示已处理的字节和剩余的字节
-dc, --display-counts显示已压缩的条目数和剩余条目数
-dd, --display-dots压缩每个条目时显示进度条。进度条使用点表示,默认每个点表示压缩了 10MB
-dg, --display-globaldots显示整体压缩的进度条,而不是每个文件的进度条。默认每个点表示压缩了 10MB
-ds, --dot-size SIZE设置进度条中每个点表示已处理的文件大小,默认为 10MB。如果设置为 0 表示关闭进度条
-du, --display-usize显示每个条目未压缩的大小
-dv, --display-volume显示每个条目的卷(磁盘)号
-D, --no-dir-entries忽略目录
-DF, --difference-archive增量压缩,即压缩新增或更新的文件到旧的压缩归档中。应该从运行原始 zip 命令的相同目录运行,因为存储在 zip 归档中的文件路径信息会被保留
-e, --encrypt压缩时进行加密,输入的密码不会被打印出来
-f, --freshen增量压缩,只压缩更新的文件。应该从运行原始 zip 命令的相同目录运行,因为存储在 zip 归档中的文件路径信息会被保留
-F, --fix, -FF, --fixfix修复已损失的压缩文件。如果压缩文件的某些部分丢失,则可以使用 -F 选项来修复,但需要一个相当完整的中心目录。如果压缩文件损坏严重或者被截断,则需要 -FF 来修复
-FS, --filesync将存档的内容与操作系统上的文件进行同步。如果归档中的条目与操作系统上的文件不匹配,则删除该条目
-g, --grow向已存在的 zip 归档文件追加内容。如果此操作失败,zip 将尝试还原存档文件到其原始状态。如果恢复失败,则存档文件可能会被损坏
-h, -?, --help相识帮助信息并退出。当 zip 无参数运行时,等同于使用该选项,显示帮助信息
-h2, --more-help显示扩展的帮助信息,包括更多关于命令行格式、模式匹配和更多少用的选项
-i, --include FILES指定被压缩的文件
-j, --junk-paths不保留被压缩的文件的目录信息,只保留文件名
-J, --junk-sfx从存档中删除所有前置追加的数据(例如 SFX 存根)
-k, --DOS-names尝试转换名称和路径以符合 MSDOS,只存储 MSDOS 属性将条目标记为 MSDOS 下的条目
-l, --to-crlf将 Unix 的行尾字符 LF 转换成 MSDOS 约定的 CR LF。此选项不应用于二进制文件
la, --log-append附加到现有日志文件。默认是覆盖
-lf, --logfile-path LOGFILEPATH打开指定的日志文件
-li, --log-info在日志中包含更多信息,例如被压缩的文件名。默认情况下只包含命令行、警告和错误以及最终状态
-ll, --from-crlf作用于 -l 选项相反。将 MSDOS 的结束行 CR LF 转换为 Unix 的 LF。此选项不应用于二进制文件
-L, --license显示 zip 许可证
-m, --move将指定的文件移动到 zip 归档文件中。目标文件会被删除,如果目标文件所在的目录变成空目录,也会被删除
-MM, --must-match所有输入的模式至少匹配一个文件,且所有输入的文件必须可读,否则 zip 将返回 OPEN 错误并退出
-n, --suffixes SUFFIXES不要尝试压缩指定后缀的文件。这些文件只是简单地存储在输出 zip(0%压缩)
-nw, --no-wild不执行内部通配符的处理。注意 Shell 仍然会执行通配符的处理,除非对通配符使用了转义
-o, --latest-time将 zip 文件的最后修改时间更改为其所有条目中最近修改时间中最近的时间
-O, --output-file OUTPUT-FILE不更改现有 zip 文件,指定新输出的 zip 文件
-p, --paths在 zip 文件中存储文件的路径信息。该选项为默认选项,可以使用 -j 选项只存储文件名
-P, --password PASSWORD使用指定密码加密 zip 中的条目。注意,该操作不安全,因为密码可能会被其他用户通过查看历史命令窥探到,安全的做法是通过交互式输入不可打印的密码完成加密
-q, --quiet静默模式。消除各种消息和提示
-r, --recurse-paths递归压缩指定目录
-R, --recurse-patterns递归遍历当前目录
-s, --split-size SPLITSIZE指定 zip 归档文件被拆分的大小
-sb, --split-bellzip 暂停分隔归档文件时响铃提示
-sc, --show-command在 zip 启动和结束时,显示命令行
-sf, --show-files显示将要操作的文件,然后退出。例如,如果创建一个新的存档,它将列出将要添加的文件。如果该选项后跟 -,即 -sf-,仅输出到打开的日志文件。对于大列表,不建议使用屏幕显示
-so, --show-options显示 zip 所有可用的选项
-sp, --split-pause如果使用 -s 启用分割,则启用分割暂停模式
-su, --show-unicode类似于选项 -sf,但是如果存在 Unicode 版本的路径则显示
-sU, --show-just-unicode如果存在,只显示 Unicode 版本的路径,否则显示该路径的标准版本
-sv, --split-verbose输出拆分时的各种详细消息,显示如何进行拆分
-t, --from-date MMDDYYYY不对最后修改时间早于指定日期的文件进行操作。其中 MM 表示月(00-12),DD 表示每个月的日(01-31),YYYY 表示年
-T, --test检查新 zip 文件的完整性,如果检查失败,那么旧的 zip 文件不会被改变,且输入的文件不会被删除(如果使用 -m 选项)
-TT, --unzip-command CMD当使用选项 -T 时,使用指定的命令对 zip 归档文件进行检测,而不是使用默认的命令 unzip -tqq
-u, --update更新 zip 归档文件中被更新的条目
-U, --copy-entries将条目从一个 zip 存档复制到另一个存档。需要 --out 选项来指定与输入存档不同的输出文件
-UN, --unicode V确定 zip 如何处理 Unicode 文件名。V 可取值有:q 如果路径不匹配,则退出;w 警告,继续使用标准路径;i 忽略 继续使用标准路径;n 不使用 Unicode 路径
-v, --verbose详细模式或打印诊断与版本信息
-ws, --wild-stop-dirs通配符 * 只用于替换文件而不包含目录。如 /foo/bar/* 只会匹配 /foo/bar/file2.c,不会匹配 /foo/bar/dir/file1.c
-x, --exclude FILES显式排除指定的文件,如 zip -r foo foo -x \*.o,将排除目录 foo 下所有以 .o 结尾的文件。注意,星号需要转义,以免被 Shell 替换
-X, --no-extra不保存额外的文件属性
-y, --symlinks压缩存储符号链接本身而不是目标文件
-z, --archive-comment提示为整个 zip 归档文件输入多行注释。注释以仅包含一个点号的行结束或者输入 ^D。也可以从文件中获取注释,如 zip -z foo < foowhat
-Z, --compression-method CM设置默认的压缩算法。目前 zip 支持的主要算法是 store、deflate 和 bzip2
-#(-0, -1, -2, -3, -4, -5, -6, -7, -8, -9)使用指定的数字 # 调节压缩速度,其中 -0 表 示没有压缩,仅打包所有文件;-1 表示最快的压缩速度,压缩率较低;-9表示最慢的压缩速度,最佳的压缩效果;默认压缩级别为 -6
-@, --names-stdin从标准输入获取输入文件列表,每行一个文件

2.1、常用选项实例

结合实例讲解以下常用到的选项

选项作用
-r递归地将一个目录及其所有子目录和文件压缩到ZIP文件中
-q在压缩文件时启用静默模式,即不显示压缩过程的详细信息
-d从现有的ZIP文件中删除指定的文件或目录
-u用于更新现有的ZIP文件,将新的文件或修改后的文件添加到ZIP存档中
-f用于刷新(更新)现有ZIP文件中的指定文件。
-m用于移动(归档)文件到一个ZIP压缩文件中,并在移动后将源文件删除。
-e用于对ZIP压缩文件进行加密。
-z为压缩文件添加注释

2.1.1、-r (压缩文件夹,解决80%的场景)

注意: 上面列举的常用命令选项很多,若只是想要一个命令能压缩即可,那么zip -r 压缩包名.zip 文件1 文件2 文件n 这个命令就可以满足你的需求了。

例如:想将以下层级结构的文件压缩为zip包

/home/test
    	└─a.txt
    	└─b.log
    	└─test01
        	└─c.txt

场景一:压缩多个文件(最常用的命令,解决80%的场景)

如想把a.txt、b.log打包进zip文件中 ,进入/home/test目录后执行zip -r test.zip a.txt b.log 。压缩包内默认不包含当前目录

[root@centos test]# pwd
/home/test
[root@centos test]# ll
总用量 8
-rw-r--r--. 1 root root 11 911 23:32 a.txt
-rw-r--r--. 1 root root 23 911 23:56 b.log
drwxr-xr-x. 2 root root 19 914 15:55 test01
[root@centos test]# zip -r test.zip a.txt b.log
  adding: a.txt (stored 0%)
  adding: b.log (deflated 74%)
[root@centos test]# 

输出中 deflated 74% 表示压缩率为 74%,即压缩后的文件大小是原文件的 26%。在这里插入图片描述

场景二:压缩所有文件,并保留层级结构
将/home/test目录下的文件压缩成zip包,并将zip包存放在/home目录下,且zip包中保留目录层级结构

执行命令 zip -r /home/test.zip /home/test

[root@centos test]# zip -r /home/test.zip /home/test
  adding: home/test/ (stored 0%)
  adding: home/test/a.txt (stored 0%)
  adding: home/test/b.log (deflated 74%)
  adding: home/test/test01/ (stored 0%)
  adding: home/test/test01/c.txt (deflated 80%)

在这里插入图片描述

场景三:压缩所有文件,层级结构从test开始

进入home目录下后,然后执行命令 zip -r test.zip test

[root@centos home]# pwd
/home
[root@centos home]# ll
总用量 8
drwxr-xr-x.  3 root  root    46 914 15:38 test

[root@centos home]# zip -r test.zip test
  adding: test/ (stored 0%)
  adding: test/a.txt (stored 0%)
  adding: test/b.log (deflated 74%)
  adding: test/test01/ (stored 0%)
  adding: test/test01/c.txt (deflated 80%)
[root@centos home]# 

在这里插入图片描述

场景四:压缩指定类型的文件
压缩当前目录下所有.txt结尾的文件

[root@centos test]# ll
总用量 8
-rw-r--r--. 1 root root 11 911 23:32 a.txt
-rw-r--r--. 1 root root 23 911 23:56 b.log
drwxr-xr-x. 2 root root 19 914 15:55 test01
[root@centos test]# zip -r test.zip  *.txt
  adding: a.txt (stored 0%)
[root@centos test]# 

在这里插入图片描述

场景五:压缩文件并排除指定文件
压缩test目录下的文件,排除test01目录 -x 指定排除目录,注意没有双引号将不起作用。

[root@centos test]# zip -r test.zip /home/test -x "/home/test/test01/*"
  adding: home/test/ (stored 0%)
  adding: home/test/a.txt (stored 0%)
  adding: home/test/b.log (deflated 74%)
[root@centos test]# zip -r test.zip /home/test -x /home/test/test01/*
  adding: home/test/ (stored 0%)
  adding: home/test/a.txt (stored 0%)
  adding: home/test/test01/ (stored 0%)
  adding: home/test/b.log (deflated 74%)
[root@centos test]# 

注意:-x排除目录需要加上双引号,若不加双引号,会把空文件夹打包进来,如上面的日志

场景六:压缩文件并忽略指定文件
与上面的-x参数功能相似

[root@centos test]# zip -r test.zip /home/test --exclude "/home/test/test01/*"
updating: home/test/ (stored 0%)
updating: home/test/a.txt (stored 0%)
updating: home/test/b.log (deflated 74%)

2.1.2、-q

-q选项:压缩文件时不显示压缩过程的详细信息。

[root@centos test]# zip -r test.zip a.txt b.log  test01
  adding: a.txt (stored 0%)
  adding: b.log (deflated 74%)
  adding: test01/ (stored 0%)
  adding: test01/c.txt (deflated 80%)
[root@centos test]# zip -q -r test.zip a.txt b.log  test01
[root@centos test]# 

可以看到,当添加-q选项后,就不打印压缩日志了。

2.1.3、-d(从压缩文件中删除指定文件)

-d选项:(d是delete的缩写)从现有的ZIP文件中删除指定的文件或目录,可以从ZIP存档中删除不需要的文件或目录。

[root@centos test]# zip -d test.zip /home/test/a.txt
deleting: home/test/a.txt
[root@centos test]# 

2.1.4、-u(更新文件)

-u选项:用于更新现有的ZIP文件,将新的文件或修改后的文件添加到ZIP存档中。

语法:zip -u  <压缩文件名>  <目录/文件>
示例:zip -u test.zip t3.txt

解释:如果test.zip压缩文件中没有t3.txt,则test.zip中会增加新文件t3.txt;如果有t3.txt,则会替换test.zip压缩文件中的旧t3.txt为新的t3.txt。

2.1.5、-f

-f选项:用于刷新(更新)现有ZIP文件中的指定文件。

语法:zip -f <压缩文件名> <要刷新(更新)的文件>
示例:zip -f test.zip t3.txt。

解释:更新test.zip压缩文件中的t3.txt文件,如果test.zip压缩文件存在该文件则会更新此文件;如果不存在则不会执行任何操作(即命令为无效命令)。

需要注意的是:使用-f选项仅更新ZIP文件中指定文件,而不会添加新文件或删除文件。如果在ZIP文件中不存在要刷新(更新)的文件,则该选项不会执行任何操作。

这里我们要对zip -f和zip -u之间的区别,二者都是用于更新现有的ZIP文件,但它们的行为略有不同。不同点如下:

zip -f:只更新已存在于ZIP文件中的文件,不会添加新文件。不会添加、不会添加、不会添加(重要的事情说三遍)。
zip -u:可以添加新文件并更新已存在的文件。

2.1.6、-m

-m选项:用于移动(归档)文件到一个ZIP压缩文件中,并在移动后将源文件删除。

[root@centos test]# ls
a.txt  b.log  test01
[root@centos test]# zip -m test.zip a.txt b.log 
  adding: a.txt (stored 0%)
  adding: b.log (deflated 74%)
[root@centos test]# ls
test01  test.zip
[root@centos test]# 

2.1.7、-e(加密)

-e选项:用于对ZIP文件进行加密。
示例:zip -e test.zip a.txt b.log
解释:压缩a.txt和b.log到压缩文件test.zip中,并将其保存为加密的ZIP文件。
在这里插入图片描述

2.1.8、-z(添加注释)

-z选项:为压缩文件添加注释。
命令格式:zip -z <添加注释的压缩文件>

在这里插入图片描述
注意:按回车可以继续输入,直到某一行单独出行了英文的.才会结束,如上图,注释后面有.但是没结束,直到单独输入了.之后才结束的

三、unzip解压文件

该命令的语法如下:

unzip [选项] 压缩包名 源文件或源目录列表

常用命令选项

参 数:
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行是时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令
unzip *.zip -d /目录

3.1、解压缩文件实例

场景一 :解压到指定目录
将/home下面的test.zip解压到/home/demo目录下

unzip /home/test.zip -d /home/demo

场景二:查看压缩包中的文件
unzip -l 命令只查看不解压。
在这里插入图片描述

[root@centos test]# unzip -l test.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  09-14-2023 17:15   home/test/
       11  09-11-2023 23:32   home/test/a.txt
        0  09-14-2023 15:55   home/test/test01/
       30  09-11-2023 23:57   home/test/test01/c.txt
       23  09-11-2023 23:56   home/test/b.log
---------                     -------
       64                     5 files
[root@centos test]# 

四、常见问题

4.1、CentOS7中命令找不到

-Bash: Unzip: Command Not Found

解决方法

# 安装zip /unzip
yum install -y unzip zip
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐