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

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作为后缀
-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

二、压缩与解压缩

2.1 gzip–压缩或解压缩

压缩文件

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

选项与参数:

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

例子:

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

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

批量解压缩

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

压缩文件夹

将/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

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

四、案例分析

案例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
专注生物信息 专注转化医学