压缩解压和tar命令

gzipbzip2xzcompress是压缩/解压命令

这些命令只能压缩文件,不能压缩目录(gzipcompress-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

bzip2xz还可以用-k参数保留源文件,但无法指定压缩文件的路径和文件名。

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

除了compress,其它三个命令还可以指定压缩比:1~91最快,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  

bzip2xz还可以用-k参数保留源文件,但是无法指定解压文件的路径和文件名。

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

GNUtar命令是归档(打包)命令

归档就是将多个文件或文件夹打包为一个文件。
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命令通过指定参数可以和压缩命令一起使用,会先打包,再压缩。
gzipbzip2xzcompress 分别对应参数zjJZ

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 -xf output.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:
使用bzip2xzcompress压缩得到的压缩文件的内容只取决于源文件的内容,而源文件的文件名、权限、时间戳等信息都不会作为内容保存。所以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解包解压

猜你喜欢

转载自blog.csdn.net/xuejianbest/article/details/80599532