一、前言
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.txt
与tmp1.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
就像这样:
三、进阶使用
上面介绍的是最基础的压缩与解压功能,它还可以更进一步,比如密码压缩,添加参数-e
:
zip -e tmp.zip tmp.txt
然后就会让你输入压缩的密码,此时想要解压步骤和前面是一样的,只不过就必须提供密码才行了:
或者你也可以直接在解压的时候使用-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 zip
、man unzip
这两个命令去查看它的其它用法。
这里主要需要注意的是zip压缩命令,一般情况下不要使用绝对路径!否则它会保存路径信息的,就像下面这样:
zip -qr tmp.zip /home/yu/tmp
此时如果你查看它的压缩结构就会发现,它会将整个目录信息都包含进去:
大多数情况下,这并不是我们想要的,所以需要注意一下,压缩的时候先用cd
命令进入了目标文件夹的父目录后,再执行zip
压缩命令。