天天看点

压缩解压和tar命令

文章目录

      • `gzip`、`bzip2`、`xz`、`compress`是压缩/解压命令
        • 压缩:
        • 解压:
      • GNU`tar`命令是归档(打包)命令
        • 打包和解包:
        • 打包并压缩:
        • 将打包并压缩的文件进行先解压再解包:
        • 注意:
      • zip和unzip既可以压缩又可以归档
      • 7z可以压缩归档和解压

gzip

bzip2

xz

compress

是压缩/解压命令

这些命令只能压缩文件,不能压缩目录(

gzip

compress

-r

选项只是将文件夹内的所有文件逐一压缩)。

压缩:

压缩并删除源文件,若当前目录有同名文件会报错或提示是否覆盖,可以加

-f

参数强制覆盖:

gzip file    #输出:file.gz
bzip2 file    #输出:file.bz2
xz file      #输出:file.xz
compress file #输出:file.Z
           

压缩但保留源文件:

gzip -c file  > file.gz 
bzip2 -c file  > output.bz2 
xz -c file > /root/file.xz
compress -c file > file.Z
           

bzip2

xz

还可以用

-k

参数保留源文件,但无法指定压缩文件的路径和文件名。

bzip2 -k file  #输出:file.bz2
xz -k file    #输出:file.xz
           

除了

compress

,其它三个命令还可以指定压缩比:

1~9

1

最快,

9

最好:

gzip -1 file
bzip2 -k6 file
xz -2 file
           

解压:

解压并删除压缩文件:

gzip -dN file.gz   # -N参数保持压缩前的文件名,后面有说明
bzip2 -d file.bz2
xz -d file.xz      
compress -d file.Z
           

解压但保留压缩文件:

gzip -dc file.gz  > file  
bzip2 -dc file.bz2  > file
xz -dc file.xz > /root/file
compress -dc file.Z > file  
           

bzip2

xz

还可以用

-k

参数保留源文件,但是无法指定解压文件的路径和文件名。

bzip2 -dk file.bz2  #得到file
xz -dk file.xz    #得到file
           

GNU

tar

命令是归档(打包)命令

归档就是将多个文件或文件夹打包为一个文件。

tar

命令不会对源文件造成影响,但若是输出文件存在则会直接覆盖,如果输出文件是目录且目录已经存在,会进行目录合并,目录里的同名文件会直接覆盖。

打包和解包:

tar -c input1 input2 > file.tar #将input1、input2打包为file.tar,tar会记录源文件的时间戳信息
tar -cf file.tar input1 input2  #将input1、input2打包为file.tar
tar -xf file.tar -C output_dir  #将file.tar解包到output_dir,-C指定解压位置(必须是目录),默认为当前目录

tar -tf file.tar #列出file.tar包里的所有文件
tar -xf file.tar input1 #只解包file.tar里的input1出来
           

tar

命令的参数可以加

-

也可以不加,

-C

参数必须加

-

打包并压缩:

tar

命令通过指定参数可以和压缩命令一起使用,会先打包,再压缩。

gzip

bzip2

xz

compress

分别对应参数

z

j

J

Z

tar -czf file.tar.gz input1 input2 #先将input1、input2进行打包,然后再用gzip进行压缩。扩展名也可为.tgz
tar -cjf file.tar.bz2 input1 input2 
tar cJf file.tar.xz input1 input2
tar cZf file.tar.Z input1 input2
           

将打包并压缩的文件进行先解压再解包:

可以直接解包,

tar

能自动识别是用什么算法进行的压缩,并选择相应解压算法:

也可以指定解压算法,若指定的解压算法和压缩算法不匹配会报错:

tar -xzf output.tar.gz
tar -xjf file.tar.bz2
tar xJf file.tar.xz
tar xZf file.tar.Z
           

注意:

Linux系统文件时间戳分atime、mtime、ctime,本文后面谈到的时间戳全部只指mtime(修改时间戳)。

A:

使用

bzip2

xz

compress

压缩得到的压缩文件的内容只取决于源文件的内容,而源文件的文件名、权限、时间戳等信息都不会作为内容保存。所以md5值相同的文件得到的压缩文件md5也相同。

若不使用

-c

参数,用以上命令压缩文件或解压文件,得到的输出文件的文件名和权限会和源文件一样。

B:

gzip

-n

参数和A相同。

C:

gzip

压缩默认会保留源文件的文件名和时间戳信息,若不想保留需加

-n

参数。

若想解压获得原来的文件名需加

-N

参数(否则会和压缩文件同名),若想获得原来的时间戳还不能用

-c

参数。

gzip -dN file.gz
gzip -lN file.gz #查看压缩前的文件名等信息
           

D:

使用

tar

打包得到的

.tar

文件的文件内容包含了以下信息:源文件的文件内容、文件名(目录还会保存目录结构)、文件权限、时间戳等。打包时可以通过

--mtime

参数指定打包文件的时间戳信息,这样打包后文件的文件内容只取决于源文件的内容、权限和文件名(若是目录还包括目录结构)。

最后:

如果用

tar -czf

对相同内容的文件打包并压缩,不同时间生成的

.tar.gz

文件的md5是不同的,因为

tar -czf

命令会先打包成

.tar

文件再调用

gzip

进行压缩,

.tar

文件的时间戳不同所以压缩后的文件内容也不同。

以下命令可以保证不同时间打包的相同内容的文件md5相同:

tar -c input1 input2 | gzip -n > output.tar.gz
           

但是如果文件的时间戳改变了,即使文件的内容没有发生变化(比如用vim打开文件,没有修改但是用

wq

退出),打包文件的md5值也会发生变化。

怎么保证对相同内容的文件打包总是生成md5值一样的文件呢:

tar -c --mtime='1988-01-01' input1 input2 | gzip -n > output.tar.gz
           

上面说的相同内容的文件,包括文件内容、文件名和权限都相同(若是目录还包括目录结构)。

zip和unzip既可以压缩又可以归档

zip output.zip input1 input2 #将input1、input2压缩打包到output.zip
unzip output.zip  #将output.zip解包解压
           

若压缩的文件里有中文名,解压后可能会乱码,解决此问题可以使用

unar

解压:

unar output.zip

# 指定解压密码 
unar -p 123456 output.zip
           

7z可以压缩归档和解压

安装:

yum -y install p7zip

sudo apt install p7zip
           

压缩:

7z a -t7z -r output.7z ~/input
7za a -t7z -r output.7z ~/input
           

解压:

7z x output.7z -r -o ~/output
7za x output.7z -r -o ~/output