LMLPHP后院

Linux下使用tar和zip进行压缩解压缩教程技术

maybe yes 发表于 2016-10-16 11:38

计算机技术是实践性非常强的一门学科。就像你看到别人会骑独轮车一样,虽然看懂了其中的奥妙和步骤但是没有练习,一样是不会的。这个社会上懂技术的人非常多,很多 IT 大佬并不是技术出身,但是下属经常汇报工作,耳濡目染,他懂的技术肯定比一般做了十多年技术的程序员还多得多,在这些懂技术的人里面找到真正能干事的人是不多的。

下面开始在 Linux进行压缩和解压缩教程。本文主要讲解 tar,zip,gzip,gunzip 的使用

Linux 下的的压缩操作是不同于 Windows 下的。在 Windows 下很多软件压缩和打包是混在一起进行的,一般打包了也就压缩了。而在 Linux 下这两个操作一般都是分开的,打包就是打包,压缩就是压缩,当然也是可以一起进行的。

使用 tar 命令打包,示例如下:

$ tar -cf lmlphp.rar filename_1 foldername_1 filename_2

tar 命令的 c 参数表示创建,f 参数表示后面是本次操作对应的文件名,f 参数必须是最后一个参数,后面可以没有空格,再后面就紧跟个需要打包的文件和文件夹名称。

使用 tar 命令打包并指定目录,这样可以防止压缩包里面有太多的文件夹层级关系,指定目录使用 --directory= 或者使用 -C,示例如下:

$ tar -cf lmlphp.rar --directory=/srv/www/lmlphp/ filename_1 filename_2
// or
$ tar -cf lmlphp.rar -C /srv/www/lmlphp filename_1 filename_2

tar 命令的其他参数,v 表示输出执行过程信息,这个一般不需要特别是远程连接的时候,占用带宽。z 参数表示使用 gzip。使用 z 参数需要注意的是:z 参数在创建(c)的时候是没有问题的,表示打包的过程中使用 gzip 压缩,生成的文件后缀名是 .tar.gz(也可以是 .tgz);如果在解压缩(x)的时候使用 z 参数,则表明该压缩包文件必须是使用了 gzip 压缩的,否则是不能解压的,会报如下所示的错误

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

使用 tar 命令进行解压缩,使用 x 参数,同样可以指定目录,示例如下:

$ tar -xf lmlphp.rar -C extract_foldername

tar 命令的参数除了 z 参数是用来压缩之外,还有 j 参数也是用来压缩的。j 参数很少用,生成的文件名后缀为 .tar.bz2,如下示例:

$ tar -czf lmlphp.tar.gz filename_1 filename_2
$ tar -cjf lmlphp.tar.bz2 filename_1 filename_2

使用 tar 命令进行打包操作并压缩,一般情况下都是因为有多个文件,如果只有一个文件需要压缩,可以直接使用 gzip 命令进行压缩,与之对应的解压命令是 gunzip。使用 gzip 命令时如果后面的参数是目录,则会将该目录下面的所有的文件都变成 .gz 后缀的,使用 gunzip 可以还原误操作。

使用 gzip 命令一样可以标准输出再写入文件,这样就不会直接影响原文件,使用 -c 参数然后写入文件,如下示例:

$ gzip -c filename_1 > filename_1.gz

使用 tar 命令查看压缩包中的文件信息,使用 t 参数,如下示例:

$ tar -tf lmlphp.tar

上面的命令会打印出压缩包 lmlphp.tar 里面的文件信息。

tar 命令的最后两个需要介绍的参数,u 和 r,这两个也是特别有用的参数。r 参数表示在压缩包后面追加一个文件,如果是同名的,解压出来以后就会覆盖之前的文件。u 参数表示更新压缩包中的文件,如果参数后面的文件和压缩包中的文件是完全相同的,则不会加入到压缩包,u 参数目前测试下来只能检测到压缩包中的最后一个与之同名的文件进行对比,其实效果大部分情况下都是和参数 r 一样的。

这里需要解开一个迷惑,在使用参数 r 或者 u 之后,使用 tar -tf lmlphp.tar 来查看压缩包里文件信息时,会发现里面有很多同名的文件,这个在压缩包里面是允许的。特别是当你使用 r 参数覆盖了其中一个与之内容不同的同名文件后,使用 u 参数将刚刚被覆盖的文件用原先的内容恢复这个同名文件时,会发现压缩包里面尾部多了两个与之同名的文件,但解压出来之后,就以最后面的同名文件为准,相当于没有改变,但是压缩包体积却变大了。所以,参数 r 或 u 只会让压缩包体积越来越大。

tar 命令实战场景,解压文件夹中所有压缩包将文件释放到另外一个文件夹中,如下示例:

$ ls *.tar|xargs -i tar -xvf {} -C extract_foldername

上文讲解了那么多 tar 和 gzip 的使用方法,确实很乏味,真实场景下,估计更多人还是喜欢用更加简单的方式来存档文件,所以 Linux 下也提供了更加简单的方法,那就是 zip 命令。zip 命令有个搭档,那就是 unzip,一个用来打包加压缩,一个用来解压缩。zip 命令真的很好用,唯一的缺点就是没有 tar 那么细腻,一般正式的对接场合就不太适用。网上有一些说法说 zip 的压缩比没有 gzip 高,但是本人试了几次,得出的结果是 .zip 在很多时候完胜 tar.gz 包。而我平时存档文件也都是用 zip 命令,这个和 Windows 的兼容非常好,而 .tar 包在很多人的 Windows 下就打不开,包括我的很多同事。

zip 命令的参数 -r 表示递归,-y 表示保存符号链接文件,-y 是默认是不指定的,另外一个参数 -q 非常重要,特别是文件夹下面文件太多的情况下可以不需要输出可以加快速度。如下示例:

$ zip lmlphp.zip -r /srv/www/lmlphp -q
$ unzip lmlphp.zip
$ gunzip *.gz > /dev/null 2>&1

本文依然是一气呵成。

相关文章
2024-04-25 11:56:44 1714017404 0.029224