欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

压缩解压和tar命令

程序员文章站 2024-03-13 23:48:34
...

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解包解压

上一篇: 正则匹配手机号

下一篇: