Linux【2】-管理文件-5-打包压缩(tar/gz/zip/rar/unzip/gzip)

  • 归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。归档文件没有经过压缩,因此,它占用的空间是其中所有文件和目录的总和。通常,归档总是会和系统(数据)备份联系在一起,不过,有关数据备份的内容,留到后续章节讲,本章仅学习归档命令的基本使用。
  • 和归档文件类似,压缩文件也是一个文件和目录的集合,且这个集合也被存储在一个文件中,但它们的不同之处在于,压缩文件采用了不同的存储方式,使其所占用的磁盘空间比集合中所有文件大小的总和要小。

压缩是指利用算法将文件进行处理,已达到保留最大文件信息,而让文件体积变小的目的。其基本原理为,通过查找文件内的重复字节,建立一个相同字节的词典文件,并用一个代码表示。比如说,在压缩文件中,有不止一处出现了 “C语言中文网”,那么,在压缩文件时,这个词就会用一个代码表示并写入词典文件,这样就可以实现缩小文件体积的目的。

由于计算机处理的信息是以二进制的形式表示的,因此,压缩软件就是把二进制信息中相同的字符串以特殊字符标记,只要通过合理的数学计算,文件的体积就能够被大大压缩。把一个或者多个文件用压缩软件进行压缩,形成一个文件压缩包,既可以节省存储空间,有方便在网络上传送。

如果你能够理解文件压缩的基本原理,那么很容易就能想到,对文件进行压缩,很可能损坏文件中的内容,因此,压缩又可以分为有损压缩和无损压缩。无损压缩很好理解,指的是压缩数据必须准确无误;有损压缩指的是即便丢失个别的数据,对文件也不会造成太大的影响。有损压缩广泛应用于动画、声音和图像文件中,典型代表就是影碟文件格式 mpeg、音乐文件格式 mp3 以及图像文件格式 jpg。

采用压缩工具对文件进行压缩,生成的文件称为压缩包,该文件的体积通常只有原文件的一半甚至更小。需要注意的是,压缩包中的数据无法直接使用,使用前需要利用压缩工具将文件数据还原,此过程又称解压缩。

Linux 上的压缩包文件格式,除了 Windows 最常见的*.zip、*.rar、.7z 后缀的压缩文件,还有 .gz、.xz、.bz2、.tar、.tar.gz、.tar.xz、tar.bz2

文件处理过程免不了需要压缩和解压缩,这里整理一下常见的压缩相关的命令

文件后缀名 说明
*.zip zip 程序打包压缩的文件;用 unzip 解压
*.rar rar 程序压缩的文件;用 unrar 解压
*.tar tar 程序打包,未压缩的文件;用 tar –xvf 解压
*.7z 7zip 程序压缩的文件
*.gz gzip 程序 (GNU zip) 压缩的文件;用 gzip -d或者gunzip 解压
*.xz xz 程序压缩的文件
*.bz2 tar 打包,gzip 程序压缩的文件;用 bzip2 -d或者用bunzip2 解压
.tar.gz和.tgz tar打包,gzip程序压缩的文件;用 tar –xzf 解压
*.tar.xz tar打包,xz程序压缩的文件
*.tar.bz2 tar打包,bzip2程序压缩的文件;用tar –xjf 解压
*.tar.7z tar打包,7z程序压缩的文件
*.Z 用 uncompress 解压
*.tar.Z 用tar –xZf 解压
solitairetheme8的解压缩: cp cudnn-8.0-linux-x64-v5.1.solitairetheme8 cudnn-8.0-linux-x64-v5.1.tgz ;tar -xvf cudnn-8.0-linux-x64-v5.1.tgz

一、打包与解包

1.1 tar(打包,但不压缩)

gzip 或 bzip2 带有多个文件作为参数时,执行的操作是将各个文件独立压缩,而不是将其放在一起进行压缩。这样就无法产生类似于Windows环境下的文件夹打包压缩的效果。(gzip与bzip2也可以使用文件夹作为参数,使用 -f 选项,但也是将其中的每个文件独立压缩)。为了实现打包压缩的效果,可以使用命令 tar 进行文件的打包操作(archive),再进行压缩。

  tar 指令可以将文件打包成文件档案(archive)存储在磁盘/磁带中,打包操作一般伴随压缩操作,也可以使用 tar 指令对打包压缩后的文件解压。

tar 常用命令参数如下:

基本格式:tar [Options] file_archive  //注意tar的第一参数必须为命令选项,即不能直接接待处理文件

常用命令参数:

//指定tar进行的操作,以下三个选项不能出现在同一条命令中
-c        //创建一个新的打包文件(archive)
-x        //对打包文件(archive)进行解压操作
-t        //查看打包文件(archive)的内容,主要是构成打包文件(archive)的文件名

//指定支持的压缩/解压方式,操作取决于前面的参数,若为创建(-c),则进行压缩,若为解压(-x),则进行解压,不加下列参数时,则为单纯的打包操作
-z        //使用gzip进行压缩/解压,一般使用.tar.gz后缀
-j        //使用bzip2进行压缩/解压,一般使用.tar.bz2后缀  (再告诉大家一个小秘密,现在 tar 命令已经足够智能了,我们完全不需要指定解压缩方式,tar 就会根据文件后缀来自动采用匹配的解压方法。???)

//指定tar指令使用的文件,若没有压缩操作,则以.tar作为后缀
-f filename   //-f后面接操作使用的文件,用空格隔开,且中间不能有其他参数,推荐放在参数集最后或单独作为参数
         //文件作用取决于前面的参数,若为创建(-c),则-f后为创建的文件的名字(路径),若为(-x/t),则-f后为待解压/查看的打包压缩文件名

//其他辅助选项
-v        //详细显示正在处理的文件名
-C Dir      //将解压文件放置在 -C 指定的目录下
-p(小写)     //保留文件的权限和属性,在备份文件时较有用
-P(大写)     //保留原文件的绝对路径,即不会拿掉文件路径开始的根目录
--exclude=file //排除不进行打包的文件

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

# tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

# tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

# tar -xf all.tar
这条命令是解出all.tar包中所有文件,-x是解开的意思

打包

tar –cvf jpg.tar *.jpg 
//将目录里所有jpg文件打包成tar.jpg

tar –czf jpg.tar.gz *.jpg   
//将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
(压缩后命名为.tar.gz,便于别人来识别压缩后的名字)

tar –cjf jpg.tar.bz2 *.jpg 
//将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2

tar –cZf jpg.tar.Z *.jpg   
//将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z


rar a jpg.rar *.jpg 
//rar格式的压缩,需要先下载rar for linux

zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux

解包

tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2   //解压 tar.bz2
tar –xZvf file.tar.Z   //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip

tar xvJf libpng-1.6.30.tar.xz

常见的tar指令操作如下:

压缩文件夹: 

 tar -cvjpf etc.tar.bz2 /etc  //-c为创建一个打包文件,相应的-f后面接创建的文件的名称,使用了.tar.bz2后缀,-j标志使用bzip2压缩,最后面为具体的操作对象/etc目录
 
 查看:
 tar -tvjf etc.tar.bz2     //-t为查看操作,则-f对应所查看的文件的名称,文件后缀显示使用bzip2进行压缩,所以加入-j选项,-v会显示详细的权限信息

 解压
 tar -xvjf etc.tar.bz2     //-x为解压操作,则-f指定的是解压使用的文件,文件后缀显示使用bzip2进行压缩,所以加入-j选项,即使用bzip2解压
                   //若只解压指定打包文件中的一个文件,在上述指令的最后加上带解压文件名作为参数即可

注意:

使用tar打包的文件会保存原有的文件路径,并默认取出了所有成员文件路径的根目录。这样做的目的在于,当用户在某一目录如/home/haha目录下进行解压操作时,tar会将解压出来的文件路径与当前目录拼接,即为 /home/haha/etc/emacs,从而将文件解压在当前目录下。(如果还有印象,目录名也可以使用 -C 选项指定)但若是打包压缩时不取出文件路径的根目录,则会按照存储的绝对路径如/etc/emacs解压文件,可能将/etc文件下的相应文件覆盖掉,当然在进行备份和恢复时该操作是有效的。tar提供 -P选项来保留文件路径的根目录。

只查看不解包文件-t参数

tar -tf test.tar

保留文件属性和跟随链接(符号链接或软链接),有时候我们使用tar备份文件当你在其他主机还原时希望保留文件的属性(-p参数)和备份链接指向的源文件而不是链接本身(-h参数)

tar -cphf etc.tar /etc

以使用 gzip 工具创建 *.tar.gz 文件为例来说明,只需在创建 tar 文件的基础上添加 -z 参数,使用 gzip 来压缩文件

tar -czf etc.tar.gz ~

解压 *.tar.gz 文件

tar -xzf etc.tar.gz

现在我们要使用其他的压缩工具创建或解压相应文件只需要更改一个参数即可:

|压缩文件格式    |参数   |
|:-----------:|:--:|
|*.tar.gz        | -z |
|*.tar.xz       | -J |
|*tar.bz2      | -j |

我的案例(数据备份用)

将test文件下的所有数据打包

[root@c04 test]# tar -cpvfhz data.tar.gz *
array.slurm
run.slurm

注:-p 保留了文件的属性

解包文件

mkdir test
tar -xzvf data.tar.gz  -C test

有针对性地解压某个文件

通过查看 tar.gz 文件中的内容,我们知道了 curl 软件包中有一个 http.c 文件。现在我想提取出 curl-7.34.0/lib/http.c 这个文件,看看它的源码,但是又不想把这个软件压缩包全部解压,该怎么做呢?即我们如何从一个打包压缩的 tar.gz 文件中提取出某一个单独的文件呢?方法总比问题多,揭晓答案:

#原来就在拆包解压命令的后面直接加上要提取的文件全路径就好了, 简单!
[roc@roclinux ruanjian]$ tar -xzvf curl-7.34.0.tar.gz
curl-7.34.0/lib/http.c
curl-7.34.0/lib/http.c

#看, 这就是我们单独提取出来的文件
[roc@roclinux ruanjian]$ tree curl-7.34.0
curl-7.34.0
`-- lib
    `-- http.c

1 directory, 1 file

报错

Cannot utime: Invalid argument

tar xJf flare.tar.xz

改为:

tar xmJf flare.tar.xz

参数介绍:

-m, --touch                don't extract file modified time

二、压缩与解压缩

2.1 gzip–压缩或解压缩

在很久以前,UNIX 操作系统上的压缩工具叫作 compress,这个压缩工具采用了很著名的 LZW 压缩算法。但是由于 Unisys 和 IBM 拥有 LZW 压缩算法的专利,所以 UNIX 操作系统不能再随意使用这个算法和这个压缩工具了。为了解决这个问题,Jean-loup Gailly 编写了 gzip 压缩工具,完全替代了有专利争议的 compress 工具,从此 gzip 诞生了。

gzip 工具还被囊括进了 GNU 项目中,成为了其中的一员。

gzip 只能针对普通文件(regular file)进行压缩和解压,对于文件夹、符号链接等是不支持的。如果你想把多个文件一起压缩并打包,gzip 自身也是办不到的,需要有它的好兄弟 tar 命令来帮助完成。

选项与参数:

-c  :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d  :解压缩的参数;
-t  :可以用来检验一个压缩文件的一致性~看看档案有无错误;
-v  :可以显示出原档案/压缩文件案的压缩比等信息;
-#  :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6

压缩文件

[root@www ~]# gzip [-cdtv#] 檔名
[root@www ~]# zcat 檔名.gz

例子:

gzip -9 samplefile
gzip -1 samplefile
可以看到压缩后的大小不一样

gzip 命令确实为用户提供了这样的选择权,包含了九个压缩级别,分别是 1、2、3、4、5、6、7、8、9:

  • “1 级”表示压缩速度最快,但强度不高。
  • “9 级”表示压缩强度最高,但速度较慢。
  • 默认情况下是 6 级。

只能压缩,不能打包,所以要先打包,再压缩

批量解压缩

gzip -d *.gz

Linux压缩保留源文件的方法:

gzip -c filename > filename.gz

范例一:将 /etc/man.config 复制到 /tmp ,并且以 gzip 压缩

[root@www ~]# cd /tmp
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config
man.config:      56.1% -- replaced with man.config.gz

[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
-rw-r--r-- 1 root root 2684 Nov 10 17:24 /tmp/man.config.back.Z
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz  <==gzip压缩比较佳 [root@www tmp]# gzip -9 -c man.config > man.config.gz

将文件夹下的的文件夹中的文件批量解压缩

find . -name "*.ent.gz" -print0 |xargs -0 gzip -d

注:

  • 一般来说,gzip就够用了,尽量不要用gunzip

2.2 gunzip 解压缩

1.作用

gunzip命令作用是解压文件,使用权限是所有用户。

2.格式

gunzip [-acfhlLnNqrtvV][-s ][文件...]
或者gunzip [-acfhlLnNqrtvV][-s ][目录]

3.主要参数

-a或--ascii:使用ASCII文本模式。
-c或--stdout或--to-stdout:把解压后的文件输出到标准输出设备。
-f或-force:强行解开压缩文件,不理会文件名称或硬连接是否存在,以及该文件是否为符号连接。
-h或--help:在线帮助。
-l或--list:列出压缩文件的相关信息。
-L或--license:显示版本与版权信息。
-n或--no-name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其忽略不予处理。
-N或--name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其回存到解开的文件上。
-q或--quiet:不显示警告信息。
-r或--recursive:递归处理,将指定目录下的所有文件及子目录一并处理。
-S或--suffix:更改压缩字尾字符串。
-t或--test:测试压缩文件是否正确无误。
-v或--verbose:显示指令执行过程。
-V或--version:显示版本信息。

4.说明

gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为“.gz”。事实上,gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成

解压缩保留源文件的方法:

gunzip –c filename.gz > filename

三、打包压缩

3.1 zip

让我们回到2000年4月14日那天,就在美国密尔沃基的一家旅馆里,人门发现了一具尸体,经尸检,死者的死因是酗酒过量导致的死亡。死者被发现时,手里还拿着空酒瓶,死亡的前一刻应该还在不断地饮酒。

对于一座城市来说,类似这样的事件并不稀奇。但是,这一次却引起了计算机界的极度关注,人们在世界各地自发地发起纪念活动,哀悼一个重要生命的离去。

他是谁呢?他的名字叫菲利普·卡兹(Philip Katz),他是 Zip 压缩算法的发明人,全世界几乎每一台电脑中都运行着他的压缩程序,压缩后的文件后缀常以“.zip”结尾。这些 zip 结尾的文件大都有一个共同的特点,那就是在文件内容的开头部分都标有“PK”的字样,这是作者名字的首字母缩写。

那一年,菲利普·卡兹年仅 37 岁。

基本参数:

-r  递归压缩目录,及将制定目录下的所有文件以及子目录全部压缩。
-m  将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中。
-v  显示详细的压缩过程信息。
-q  在压缩的时候不显示命令的执行过程。
-压缩级别   压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好。
-u  更新压缩文件,即往压缩文件中添加新文件。

压缩文件夹

将/home/wwwroot/xahot/ 这个目录下所有文件和文件夹打包为当前目录下的xahot.zip

zip –q –r xahot.zip /home/wwwroot/xahot

上面的命令操作是将绝对地址的文件及文件夹进行压缩.以下给出压缩相对路径目录

比如目前在Bliux这个目录下,执行以下操作可以达到以上同样的效果.

zip –q –r xahot.zip xahot

比如现在我的xahot目录下,我操作的zip压缩命令是

zip –q –r xahot.zip *

解压缩

unzip xahot.zip

使用 zip 打包文件

# 将 test 目录打包成一个文件,-r 表示递归打包包含子目录的全部内容,-q 表示安静模式,-o 表示输出文件,其后紧跟打包输出文件名
zip -r -q -o test.zip  /home/test
# 使用 du 命令查看打包后文件的大小
du -h test.zip
# 使用 file 命令查看文件大小和类型
file test.zip

设置压缩级别为9和1(9最大,1最小),重新打包

# 1表示最快压缩但体积大,9表示体积最小但耗时最久,-x 排除上一次我们创建的zip文件,路径必需为绝对路径
zip -r -9 -q -o test_9.zip /home/test -x ~/*.zip
zip -r -1 -q -o test_1.zip /home/test -x ~/*.zip
# 再用 du 命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小,-h 表示可读,-d 表示所查看文件的深度
du -h -d 0 *.zip ~ | sort

创建加密 zip 包

# 使用 -e 参数可以创建加密压缩包
zip -r -q -o test.zip  /home/test

zip 命令,与 gzip/bzip2 命令有一个明显的不同,那就是 zip 命令在压缩过程中,会保留原始文件,这一点要记住哦。

再介绍下 -v 选项和 -t 选项

假设有一个很大的压缩文件 large.zip,我不想解压缩,只想看看它里面有什么,这时就需要-v选项的协助:

[roc@roclinux ruanjian]$ unzip -v zdata.zip
Archive:  zdata.zip
Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
      96  Defl:N        9  91% 02-20-2016 16:49 b51bd543  mynote.txt
       0  Stored        0   0% 02-18-2016 11:13 00000000  soft/
  999579  Defl:N   999279   0% 02-17-2016 22:52 64e7f8d5  soft/redis-2.6.16.tar.gz
41756805  Defl:N 41320991   1% 02-17-2016 22:52 fefe0b94  soft/go1.1.2.Linux-amd64.tar.gz
       0  Stored        0   0% 02-18-2016 11:13 00000000  soft/.abc
--------          -------  ---                            -------
42756480         42320279   1%                            5 files

我下载了一个压缩文件 large.zip,想验证一下这个压缩文件是否下载完全了,-t选项就派上用场了。

[roc@roclinux ruanjian]$ unzip -t zdata.zip
Archive:  zdata.zip
    testing: mynote.txt               OK
    testing: soft/                    OK
    testing: soft/redis-2.6.16.tar.gz   OK
    testing: soft/go1.1.2.Linux-amd64.tar.gz   OK
    testing: soft/.abc                OK
No errors detected in compressed data of zdata.zip.

竟然能在 zip 文件中删除文件

zip 其实很博大精深,很多你想象不到的功能,它都具备,很多地方体贴至极。下面我们举一个例子,来证明给你看。

有时候我们的工程师在辛辛苦苦压缩好 zip 文件后,发现里面有几个文件并不需要压缩进去,多余的文件占用了不少的空间。如果我们解压后再压缩的话,不仅耗费 CPU 资源和磁盘空间,而且还要有专人跟进等待和操作。

遇到这类问题该怎么办?zip 早就帮你想到啦。zip 提供了-d选项,即 –delete 选项,可以让我们在已经压缩好的 zip 文件中删除某个特定文件。

#还记得我们在压缩时囊括了的mynote.txt吧, 现在把它从zip文件中清掉
[roc@roclinux ruanjian]$ zip zdata.zip -d mynote.txt
deleting: mynote.txt

#再看看, mynote.txt已经无影无踪了
[roc@roclinux ruanjian]$ unzip -v zdata.zip
Archive:  zdata.zip
Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       0  Stored        0   0% 02-18-2016 11:13 00000000  soft/
  999579  Defl:N   999279   0% 02-17-2016 22:52 64e7f8d5  soft/redis-2.6.16.tar.gz
41756805  Defl:N 41320991   1% 02-17-2016 22:52 fefe0b94  soft/go1.1.2.Linux-amd64.tar.gz
       0  Stored        0   0% 02-18-2016 11:13 00000000  soft/.abc
--------          -------  ---                            -------
42756384         42320270   1%                            4 files

这个用法有时候会事半功倍,比如在备份大规模数据或文件时,可以节省很多压缩和解压缩的时间。时间不是挤出来的,而是省出来的。

3.2 使用 unzip 命令解压缩 zip 文件

# 将 test.zip 解压到当前目录
unzip test.zip
# 使用安静模式,将文件解压到指定目录

unzip -q test.zip -d ziptest
# 不想解压,只想查看压缩包的内容可以使用 -l 参数
unzip -l test.zip
#  Linux 上面默认使用的是 UTF-8 编码,防止解压后出现中文乱码,要用参数 -O
unzip -O GBK 中文压缩文件.zip

3.3 rar

CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境。首先需要确定自己的系统是64位还是32位的,通过这个命令:

[root@localhost]# uname -a

出现的内容中如果有x86_64就是64位的,没有就是32位的。 后面是X686或X86_64则内核是64位的,i686或i386则内核是32位的。

为什么要确定环境,因为如果你是64位的系统,安装32位rar环境后是无法使用的,会出现这种错误:

bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

所以先确定是多少位的再安装对应的rar。

在终端中输入命令:

32位:

wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz

64位

wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz

下载对应的rar安装包,可以看到明显有个x64的区别,至于版本号,可以去官网自行选择,反正能用。

下载好安装包后,后续操作就都一样了,首先解压安装包:

tar -zxvf rarlinux-4.0.1.tar.gz // 对应32位下载的
tar -zxvf rarlinux-x64-5.3.0.tar.gz // 对应64位下载的

进入解压出的“rar”文件夹:

cd rar

进行配置:

make

出现下面的信息就是安装成功了:

mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib

现在就可以任意使用了,关于rar的操作有很多,这里只记录两个最常用的:

解压:

rar x test.rar //解压 test.rar 到当前目录

压缩

rar test.rar ./test/ //将 test目录打包为 test.rar

查看更多说明:

rar h

3.4 unrar

mac上安装unrar

brew install unrar 

从指定文件或目录创建压缩包或添加文件到压缩包

rm *.zip
# 使用a参数添加一个目录~到一个归档文件中,如果该文件不存在就会自动创建
rar a test.rar .

解压缩rar文件

unrar x Httpclient_jar.rar 

# 全路径解压
unrar x test.rar
# 去掉路径解压
mkdir tmp
unrar e test.rar tmp/

查看不解压文件

rar l test.rar

从指定压缩包文件中删除某个文件

rar d test.rar .bashrc

3.5 bzip2

bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件。当执行压缩任务完成后,会生成一个以“.bz2”为后缀的压缩包。

”.bz2”格式是 Linux 的另一种压缩格式,从理论上来讲,”.bz2”格式的算法更先进、压缩比更好;而 “.gz”格式相对来讲的时间更快。

有了 gzip 为什么还要重复造轮子

gzip 的 0.1 版本是在 1992 年发布的,而 bzip2 的 0.1 版本是在 1996 年发布的,可见 bzip2 的开发是要晚于 gzip 的。由于 bzip2 与 gzip 相比,其压缩稳定性和效果都更好,所以 bzip2 一经推出,便受到了广大用户的欢迎。

由此可见,这不能算是重复造轮子,bzip2 让世界变得更加美好了。

bzip2 命令的基本格式如下:

[root@localhost ~]# bzip2 [选项] 源文件

源文件指的要压缩或解压缩的文件,该命令常用的选项及各自的含义如表 1 所示。

选项 含义

-d  执行解压缩,此时该选项后的源文件应为标记有 .bz2 后缀的压缩包文件。
-k  bzip2 在压缩或解压缩任务完成后,会删除原始文件,若要保留原始文件,可使用此选项。
-f  bzip2 在压缩或解压缩时,若输出文件与现有文件同名,默认不会覆盖现有文件,若使用此选项,则会强制覆盖现有文件。
-t  测试压缩包文件的完整性。
-v  压缩或解压缩文件时,显示详细信息。
-数字 这个参数和 gzip 命令的作用一样,用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高

注意,gzip 只是不会打包目录,但是如果使用“-r”选项,则可以分别压缩目录下的每个文件;而 bzip2 命令则根本不支持压缩目录,也没有“-r”选项。

【例 1】直接压缩文件

[root@localhost ~]# bzip2 anaconda-ks.cfg
#压缩成".bz2"格式

此压缩命令会在压缩的同时删除源文件。

【例 2】压缩的同时保留源文件。

[root@localhost ~]# bzip2 -k install.log.syslog
#压缩
[root@localhost ~]# ls
anaconda-ks.cfg.bz2 install.loginstalLlogsyslog install.logsyslogbz2
#压缩文件和源文件都存在

如果有 A.txt 和 B.txt 两个文件,而我想用一个命令把两个文件分别压缩为 A.txt.bz2 和 A.txt.bz2:

bzip2 abc1.txt abc2.txt

3.6 bunzip2–bz2格式的解压缩命令

要解压“.bz2”格式的压缩包文件,除了使用“bzip2 -d 压缩包名”命令外,还可以使用 bunzip2 命令。

bunzip2 命令的使用和 gunzip 命令大致相同,bunzip2 命令只能用于解压文件,即便解压目录,也是解压该目录以及所含子目录下的所有文件。

bunzip2 命令的基本格式为:

[root@localhost ~]# bunzip2 [选项] 源文件

此命令常用的选项以及各自的含义,如表 1 所示。

选项 含义

-k  解压缩后,默认会删除原来的压缩文件。若要保留压缩文件,需使用此参数。
-f  解压缩时,若输出的文件与现有文件同名时,默认不会覆盖现有的文件。若要覆盖,可使用此选项。
-v  显示命令执行过程。
-L  列出压缩文件内容。

先试试使用 gunzip2 命令来进行解压缩,例如:

[root@localhost ~]# bunzip2 anaconda-ks.cfg.bz2

”.bz2” 格式也可以使用 “bzip2 -d 压缩包” 命令来进行解压缩,例如:

[root@localhost ~]# bzip2 -d install.log.syslog.bz2

和 “.gz” 格式一样,”.bz2” 格式压缩的纯文本文件也可以不解压缩直接查看,使用的命令是 bzcat。例如:

[root@localhost ~]# bzcat install.log.syslog.bz2

如果有 A.txt.bz2 和 B.txt.bz2 两个文件,而我想用一个命令把两个文件分别解压为 A.txt 和 B.txt:

[roc@roclinux ~]$ bunzip2 A.txt.bz2 B.txt.bz2
[roc@roclinux ~]$ ls
A.txt B.txt

bzip2 和 bunzip2 是一个东西么

在我们正式开始讲解之前,有一点必须要介绍清楚,那就是 bzip2 和 bunzip2 的关系。

其实从字面意思上我们也能够猜出个大概,bzip2 是用来压缩文件的,而 bunzip2 则是用来解压文件的,类似于 zip 和 unzip 的关系。但是很神奇的一点是,其实 bzip2 和 bunzip2 在 Linux 中是指向完全一样的程序的。

如果你在 Rehdat/Fedora/CentOS 下工作,你会发现 bunzip2 是 bzip2 的一个符号连接。

[roc@roclinux ruanjian]$ ls -Fhl /usr/bin/bunzip2
lrwxrwxrwx. 1 root root 5 2月   7 2012 /usr/bin/bunzip2 -> bzip2*

如果你在 Debian/Ubuntu 下工作,你会发现 bunzip2 和 bzip2 具有相同的 inode 节点,即两者都指向同一个程序。

root@rocubuntu75:~# cat /etc/issue
Ubuntu 14.04.1 LTS \n \l

root@rocubuntu75:~# ls -hl /bin/bunzip2 /bin/bzip2
-rwxr-xr-x 3 root root 31K Oct 21  2013 /bin/bunzip2
-rwxr-xr-x 3 root root 31K Oct 21  2013 /bin/bzip2

root@rocubuntu75:~# ls -i /bin/bunzip2 /bin/bzip2
131078 /bin/bunzip2  131078 /bin/bzip2

但是 bzip2 和 bunzip2 两个命令的行为确实完全迥异,bzip2 只服务于那些“要压缩的文件”,而 bunzip2 则只服务于那些“要解压缩的文件”。

一个程序,改个名竟然就可以有不同的行为,这是怎么实现的?通过阅读 bzip2 软件包的源代码,我们找到了精髓所在。

/* 默认情况下, 命令的工作模式是OM_Z, 即压缩模式 */
opMode = OM_Z;

/* 如果程序的名字中含有unzip或UNZIP, 那么就将命令的工作模式设置成OM_UNZ, 即解压模式 */
if ( (strstr ( progName, "unzip" ) != 0) ||
     (strstr ( progName, "UNZIP" ) != 0) )
  opMode = OM_UNZ;

这下,真相大白于天下啦!

本来不想告诉大家这个小秘密的,因为就好像魔术,一旦揭穿,就会变得索然无味了。哈哈,我们还是抓紧时间进入命令用法环节吧。

3.6 7z

7z压缩格式拥有众多优点,具有极高的压缩比率,如果你还不了解

安装
[root@pp Pipeline_Pilot_2020]# yum list |grep 7z
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
p7zip.x86_64                              16.02-10.el7                 epel
p7zip-doc.noarch                          16.02-10.el7                 epel
p7zip-gui.x86_64                          16.02-10.el7                 epel
p7zip-plugins.x86_64                      16.02-10.el7                 epel
[root@pp Pipeline_Pilot_2020]# yum install p7zip.x86_64

常规用法

2.1 解压缩7z文件

7za x phpMyAdmin-3.3.8.1-all-languages.7z -r -o./

参数含义:

  • x 代表解压缩文件,并且是按原始目录树解压(还有个参数 e 也是解压缩文件,但其会将所有文件都解压到根下,而不是自己原有的文件夹下)

  • phpMyAdmin-3.3.8.1-all-languages.7z 是压缩文件,这里我用phpadmin做测试。这里默认使用当前目录下的phpMyAdmin-3.3.8.1-all-languages.7z

  • -r 表示递归解压缩所有的子文件夹

  • -o 是指定解压到的目录,-o后是没有空格的,直接接目录。这一点需要注意。

压缩文件/文件夹

7za a -t7z -r Mytest.7z /opt/phpMyAdmin-3.3.8.1-all-languages/*

参数含义:

  • a 代表添加文件/文件夹到压缩包

  • -t 是指定压缩类型,这里定为7z,可不指定,因为7za默认压缩类型就是7z。

  • -r 表示递归所有的子文件夹

  • Mytest.7z 是压缩好后的压缩包名

  • /opt/phpMyAdmin-3.3.8.1-all-languages/*:是压缩目标。

注意:7za不仅仅支持.7z压缩格式,还支持.tar.bz2等压缩类型的。如上所述,用-t指定即可。

四、案例分析

案例1:

从genebank下载的基因组的信息:

wgs.XXXX.(##.)gbff.gz     Nucleotide GenBank flatfiles
wgs.XXXX.(##.)fsa_nt.gz   Nucleotide FASTA files
wgs.XXXX.(##.)qscore.gz   Nucleotide Quality-Score files
wgs.XXXX.(##.)gnp.gz      Protein GenPept flatfiles
wgs.XXXX.(##.)fsa_aa.gz   Protein FASTA files
stats.wgs.XXXX            Summary nucleotide statistics

因为WGS的文件比较大,所以也可以切割为几个部分

wgs.AAVP.1.gbff.gz
wgs.AAVP.2.gbff.gz
wgs.AAVP.1.fsa_nt.gz
wgs.AAVP.2.fsa_nt.gz
wgs.AAVP.1.gnp.gz
wgs.AAVP.2.gnp.gz
wgs.AAVP.1.fsa_aa.gz
wgs.AAVP.2.fsa_aa.gz

通过gunzip或者gzip –d解压缩提取文件失败,在于这个文件有两次压缩,

  1. 在win下,可以双击这个压缩文件,然后选查看(不点解压缩,相对于第一次解压缩,注意这个时候文件大小的变化),接着点击查看或者解压缩,这就是第二次解压缩
  2. 在Linux下,通过gizp –d xx xx.gz文件变为xx,然后修改xx名字为xx.gz 再次通过gizp –d xx就得到了解压缩文件了

案例2:

报错:

sam@sam-Precision-WorkStation-T7500[reads2] gzip 121228_I263_FCD1LUYACXX_L8_SZABPI020907-88_1.fq.gz
gzip: 121228_I263_FCD1LUYACXX_L8_SZABPI020907-88_1.fq.gz already has .gz suffix -- unchanged

解压缩文件的时候出现这个问题?(原来是命令错误啊,把gzip改为gunzip)

刚开始是在linux下鼠标右键选择提取到此处,提取了半天说提取失败 然后用命令行,出现如上情况 双击该文件一看,里面的东西压缩前是600M,压缩后是17G,是不是不科学啊 用windows自带的解压缩文件来看一下,如何

ps:不得其解啊,用wiondows带的360压缩却可以解压缩出里面的文件来

  1. 为什么里面的东西压缩前是600M,压缩后是17G,我解压缩后是50G
  2. 为什么其他的gz压缩文件可以在我的服务器上解压缩,而这个怪怪的文件却不可以?

    gunzip 121228_I263_FCD1LUYACXX_L8_SZABPI020907-88_1.fq (不加后面的.gz)

解压缩成功,但是我原来的压缩文件也没有了,如果要保留的话,还是得加.gz

案例3:

在用aria2c下载一个很大的数据库的时候,中间服务器重启了一下,接着上次的下载,

但在解压缩的时候,报错not in gzip format和invalid compressed data–format violated:

qqin@dragon:[humandb3]$gzip -d hg19_dbnsfp33a.txt.gz 
gzip: hg19_dbnsfp33a.txt.gz: invalid compressed data--format violated
qqin@dragon:[humandb3]$file hg19_dbnsfp33a.txt.gz 
hg19_dbnsfp33a.txt.gz: gzip compressed data, was "hg19_dbnsfp33a.txt", from Unix, last modified: Wed Feb 22 01:50:23 2017

qqin@dragon:[humandb3]$gzip -d hg19_avsnp147.txt.idx.gz 
gzip: hg19_avsnp147.txt.idx.gz: not in gzip format

解决办法:重新下载

案例4:

批量解压缩

ls *.tar.gz | xargs -n1 tar xzvf

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学