13.zip与unzip的使用

一、前言

zip是一个被广泛使用的文件压缩格式,目前Windows系统中已经自带了zip压缩与解压的功能。

而在linux系统中则可以使用zip、unzip这两个工具来进行文件的压缩与解压。

二、基本使用

我目前最常用的linux发行版是Ubuntu,其本身并不带有zip、unzip这两个工具,所以第一步需要进行安装:

sudo apt update
sudo apt install zip unzip

首先是压缩命令zip的使用,如果只想要压缩一个文件,比如tmp.txt,那么可以直接这样写:

zip tmp.zip tmp.txt

它的作用就是将tmp.txt压缩到前面的tmp.zip压缩文件中。

如果你想要同时压缩多个文件,那就跟着写即可:

zip tmp.zip tmp.txt tmp1.txt

上面这个命令,就会将后面的两个文件tmp.txttmp1.txt都压缩进tmp.zip中。

更进一步,我们大多数时候可能都是想要直接压缩整个目录,那就可以使用-r参数来递归压缩,比如下面这个简单的目录格式:

tmp
├── tmp.txt
└── tmp1.txt

那么其对应的压缩命令可以为:

zip -r tmp.zip tmp

上面的压缩命令执行后,都会打印相应的压缩过程,就像下面这样:

adding: tmp/ (stored 0%)
adding: tmp/tmp.txt (deflated 66%)
adding: tmp/tmp1.txt (deflated 34%)

如果你不想看到,那可以使用参数-q,它会静默压缩,不打印任何信息:

zip -qr tmp.zip tmp

这就是这个命令最基本的用法了,最常用的可能就是最后的这个命令,也就是直接静默压缩一个文件夹到压缩包中去。

压缩完成后还需要解压,那就需要用到unzip了,比如解压上面压缩好的那个文件,可以用参数-d指示要解压到的路径:

unzip tmp.zip -d .

比如上面这样,就是直接将其解压到当前目录下,注意.代表当前目录,..代表上一级目录,这是比较通用的常识性内容了。

如果已经存在了这个目录文件,它会每次都询问你是否进行覆盖,这时候可以使用参数-o,直接强制覆盖,不进行询问:

unzip -o tmp.zip -d .
unzip -od . tmp.zip # 参数是可以更改位置的,也可以这样写,更精简

它同样也会有提示信息,如果不需要的话,添加-q参数即可:

unzip -oqd . tmp.zip

这个命令可能就是最常用的命令了:直接静默将压缩文件解压到当前目录下。

如果只想暂时查看它内部有哪些文件,并不想要解压,那可以使用-l参数:

unzip -l tmp.zip

就像这样:

image-20231121195452573

三、进阶使用

上面介绍的是最基础的压缩与解压功能,它还可以更进一步,比如密码压缩,添加参数-e

zip -e tmp.zip tmp.txt

然后就会让你输入压缩的密码,此时想要解压步骤和前面是一样的,只不过就必须提供密码才行了:

image-20231121193743385

或者你也可以直接在解压的时候使用-P命令指定密码:

unzip -P 123456 -d . tmp.zip

看到这有没有一个念头?比如写一个脚本,尝试暴力破解压缩包!有兴趣的可以自己尝试一下,这个不难。

提示:可以在脚本中通过$?判断执行结果是否正确,如果不等于0就代表失败,然后更换密码重新尝试、不断循环即可。

除此之外还有一个-x参数某些时候可能会有点用,它可以让我们排除某个文件或文件夹。

比如我有一个node项目文件,里面的node_modules文件夹下的文件很多时候其实是没必要打包的,因为它的体积一般较大,并且只要发送给对方后,对方执行一下npm i就会自动将其从官网下载下来。

那么这时候就可以使用一下这个参数了:

zip -qr kucoding.zip kucoding/ -x "kucoding/node_modules/*"

比如上面这个命令,就是静默递归压缩kucoding这个文件夹到kucoding.zip中,并且通过-x参数排除了它下面的node_modules中所有的文件,通过通配符*匹配所有文件。

四、注意事项

上面介绍的基本就是它最常见的用法了,其它参数用的都比较少,这里就不再继续介绍了,有兴趣的可以使用man zipman unzip这两个命令去查看它的其它用法。

这里主要需要注意的是zip压缩命令,一般情况下不要使用绝对路径!否则它会保存路径信息的,就像下面这样:

zip -qr tmp.zip /home/yu/tmp

此时如果你查看它的压缩结构就会发现,它会将整个目录信息都包含进去:

image-20231121195919035

大多数情况下,这并不是我们想要的,所以需要注意一下,压缩的时候先用cd命令进入了目标文件夹的父目录后,再执行zip压缩命令。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux