=========== tar 压缩和解压命令,例子 ==============

注意:tar 仅仅是用来打包(tar 其实就是 tape archive 的意思,很古老啊,哈哈,tape(也就是磁带)什么样?就是下图中那样的),如果还需要压缩,比如压缩成 .gz 或者 .bz2 文件,则需要额外加上参数,这样子压缩出来的文件叫 tarball,仅仅是 tar 命令打包并没有压缩的文件叫 tar 文件。

一张计算机使用的 tape 的照片

另外,参数 -v ,是指显示详细过程,如果不需要显示过程(类似 zip 的 -q (quiet命令)),那么就不要加上 -v 了

压缩:
例如,把 /srv/www/example.com 目录打包并压缩成 .gz 文件

tar -czf example.com.tar.gz /srv/www/example.com

解压:
例如,把 example.com.tar.gz 解压到当前目录

tar -xzf example.com.tar.gz

另外,有一个很有用的命令 --strip n,这个命令是跳出(剥去)n 层目的意思,比如,最常见的 Drupal 安装程序,默认解压出来的话,根目录是一个 drupal 带着版本号的文件夹,例如 drupal-7.28,而我们一般早已经创建好网站目录了,只需要这个文件夹里面的文件解压到网站目录就行了,这时就可以使用 --strip 1 命令来跳过 drupal-7.28 这个目录,想跳过几层目录,这个 n 就写成几

tar -xzf drupal-7.28.tar.gz --strip 1

又例:打包时把某个目录排除在外,需要注意的是,不要在目录后面加“/”,否则并不能排除在外。所以,在习惯了使用 tab 补全命令时,结尾会自动带着“/”,此时记得删掉

测试如下:

coke@coke-instance:~/www$ tar -czf coke.im.01.tar.gz --exclude=coke.im/css coke.im
coke@coke-instance:~/www$ tar -czf coke.im.02.tar.gz --exclude=coke.im/css coke.im/  这个斜杠不妨碍
coke@coke-instance:~/www$ tar -czf coke.im.03.tar.gz --exclude=coke.im/css/ coke.im/
coke@coke-instance:~/www$ tar -czf coke.im.04.tar.gz --exclude=coke.im/css/ coke.im
coke@coke-instance:~/www$ tar -tf coke.im.01.tar.gz    排除了    coke.im/css/
coke@coke-instance:~/www$ tar -tf coke.im.02.tar.gz    排除了    coke.im/css/
coke@coke-instance:~/www$ tar -tf coke.im.03.tar.gz    未排除    coke.im/css/
coke@coke-instance:~/www$ tar -tf coke.im.04.tar.gz    未排除    coke.im/css/

所以,如果我们要打包论坛目录,但是把附件中的两个目录排除在外,因为附件目录太大了,最好不要和基本程序打包到一块儿,单独放着就好。那么我们的 bash 命令可以这么写:

#!/bin/bash
cd /srv/www/ && tar -czf "forum-$(date '+%Y-%m-%d').tar.gz" --exclude='bbs.coke.im/data/attachment/forum' --exclude='bbs.coke.im/data/attachment/image' bbs.coke.im/ && mv forum*.tar.gz ~/Dropbox/vps-sync

如上,排除两个目录,可以依次加上两个 –exclude 参数,注意末尾不要带斜杠。

============== 除了 tar 配合 gzip 还有什么压缩方式? =============

gzip 是一种比较好的压缩方式了,还有一种叫 xz ,其压缩比率更高,但是很耗资源,大致对比可参见下图:

gzip 和 xz 压缩性能对比图

网上很多观点都基本一致,除非真的为了节省空间和传输流量,要不的话 ,gzip 其实更通用,性价比也更好,所以,我们绝大多数情况下用 gzip 就可以了,或者 tar 配合 gzip

为社么要 tar 配合 gzip 呢?因为 gzip 更多的是被看成一种压缩算法,因为它就是用来配合 tar 使用的,gzip 本身不能打包文件夹和多个文件,如果使用 gzip 压缩某个目录,那么它会把目录下的每个文件单独压缩,这显然不是我们想要的。所以,gzip 最好配合 tar 来用。一个专门负责打包,一个专门负责压缩。这种专一干好一件事的原则正是 linux 无数命令的存在精髓。一个命令只做一件事,把这件事的方方面面都做好,另一件事交由另一个命令来做

== gzip 不单独用来压缩多个文件和目录,网上有很多解释,下面截图中这个解释说的已经很清楚了 ==

gzip 不能单独用来压缩多个文件和目录的解释截图

另外,linux 上也可以使用 zip 压缩解压,见下面:

============== zip 压缩和解压命令,例子 =============

如果在 /srv/www 目录,想要打包 /srv/www/website.com 目录,可以

zip -qr website.zip website.com

如果在 /srv/www/website.com 目录,想要打包本目录,可以(注意下面命令后面的“.”,这样可以把隐藏文件,例如 .htaccess 也包括在内,其实网上好多命令都是错的,建议少参考国内的(尤其 CSDN 里面的),多参考国外如 StackOverflow 的

【Update:2023.09.19】现在已经有了很多人工智能助手,尤其 ChatGPT,很多问题无需再像以前那样搜索,只需向人工智能助手提问,基本就能得到很好的回答。

zip -qr website.zip .

解压缩,例如要解压 /srv/www/website.com/website.zip 到本目录,可以

unzip -q website.zip

另外,如果是在 Windows 上面压缩的文件,且里面有中文内容,那么在 Linux 上解压缩后,有可能中文变成了乱码。

此时,可以在解压缩时加上下面这样一条命令,注意 -O 是 Dos、Windows 系统对应的,-I 是类 Unix 系统对应的,我的是 Windows 上压缩的,所以用 -O

unzip -q -O GB18030        # DOS WINDOWS

unzip -q -I GB18030        # UNIX

之所以用 GB18030,而不是 CP936(约等于 GBK) 或者 GBK、GB2312,是因为它的字符集最大。

GB18030 > GBK > GB2312

如果要覆盖原有的文件,前面加 -o,注意,一定要加到前面,所以,是两个 o,一大一小,看好了

unzip -oq -O GB18030