vlambda博客
学习文章列表

linux下的压缩和打包命令

一. 压缩的概述:

下图为压缩命令扩展名示意图:(压缩比:gzip < bzip2 < xz)(‍‍‍‍压缩速度:gz > bz2 > xz)




一. 压缩命令:

1.zip和unzip命令:

zip格式:zip [参数] file.zip file_or_dir
-A 调整可执行的自动解压缩文件。
-b 指定暂时存放文件的目录
-d 从压缩文件内删除指定的文件。
-D 压缩文件内不建立目录名称。
-f 此参数的效果和指定"-u"参 数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-F 尝试修复已损坏的压缩文件。
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-i <范本样式> 只压缩符合条件的文件。
-j 只保存文件名称及其内容,而不存放任何目录名称。
-J 删除压缩文件前面不必要的数据。
-k 使用MS-DOS兼容格式的文件名称。
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n <字尾字符串> 不压缩具有特定字尾字符串的文件。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显示指令执行过程
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-S 包含系统和隐藏文件。
-t <日期时间> 把压缩文件的日期设成指定的日期。
-T 检查备份文件内的每个文件是否正确无误。
-u 更换较新的文件到压缩文件内。
-x <范本样式> 压缩时排除符合条件的文件。
-X 不保存额外的文件属性。
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-z 替压缩文件加上注释。
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
<压缩效率> 压缩效率是一个介于1-9的 数值。


unzip格式:unzip [参数] file.zip
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确,但不解压。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行时显示详细的信息。或查看压缩文件目录,但不解压。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P <密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-X 解压缩时同时回存文件原来的UID/GID
-d <目录> 指定文件解压缩后所要存储的目录。
-x <文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令。


zip和unzip示例:

# 压缩文件
zip myfile.zip myfile
# 压缩文件夹(包含子目录)
zip -r mydir.zip mydir
# 压缩当前目录所有文件
zip mydir.zip *
# 解压文件
unzip mydir.zip
# 测试压缩包完整性
$ zip -T myfile.zip
test of myfile.zip OK
# 测试压缩包文件内容
$ unzip -t myfile.zip
Archive: myfile.zip
   testing: t.md OK
   testing: t.php OK
   testing: t.php.zip OK
No errors detected in compressed data of myfile.zip.
# 查看压缩包里内容
$ unzip -l myfile.zip
Archive: myfile.zip
  Length Date Time Name
--------- ---------- ----- ----
  
8121 06-08-2016 17:03 t.md
  740 06-08-2016 17:02 t.php
  1666 07-30-2016 17:38 t.php.zip

--------- -------
    10527 3 files
# 从压缩包里删除文件t.php.zip
$ zip -d myfile.zip t.php.zip
deleting: t.php.zip
# 从压缩包里删除文件t.php
$ zip -d myfile.zip t.php
deleting: t.php
# 添加文件到压缩包里
$ zip -u myfile.zip t.php
  adding: t.php (deflated 57%)
# 给压缩包添加注释
$ zip -z myfile.zip
enter new zip file comment (end with .):
test
# 查看压缩包注释
$ unzip -z myfile.zip
Archive: myfile.zip
test
# 解压到指定文件夹
$ unzip myfile.zip -d my
Archive: myfile.zip
test 
  inflating: my/t.md
  inflating: my/t.php
# 排除文件不解压
$ unzip myfile.zip -x t.php -d my
Archive: myfile.zip
test 
  inflating: my/t.md


2.gzip和gunzip(默认会删除源文件)

gzip是一个被广泛使用的压缩命令,gunzip是与其对应的解压命令。它们直接替换原文件。其实gunzip只是gzip的硬连接,所有操作都可以用gzip完成,filegzip压缩后为file.gz
gzip格式:gzip [参数] file_or_dir
-a--ascii:使用ASCII文字模式;
-d--decompress----uncompress:解开压缩文件;
-f--force:强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
-l--list:列出压缩文件的相关信息;
-k:保留源文件;
-n--no-name:压缩文件时,不保存原来的文件名称及时间戳记;
-N--name:压缩文件时,保存原来的文件名称及时间戳记;
-q--quiet:不显示警告信息
-r--recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-S<压缩字尾字符串>或--suffix<压缩字尾字符串>:更改压缩字尾字符串;
-t--test:测试压缩文件是否正确无误;
-v--verbose:显示指令执行过程;
-V--version:显示版本信息;
-<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高;


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

gzip和gunzip示例:

# 压缩1.log,同时会自动删除源文件
gzip 1.log
# 解压1.log.gz,同时会自动删除压缩包
gzip -d 1.log.gz
# 压缩1.log,保留源文件
gzip -k 1.log
# 解压1.log.gz,保留压缩包
gzip -dk 1.log.gz
# 查看压缩包信息
gzip -l 1.log.gz
# 递归的对目录里的每个文件单独压缩
gzip -r mydir


3.bzip2

bzip2用于压缩,bunzip2用于解压,它们直接删掉原文件。当然bzip2也能进行解压。压缩后的文件file为file.bz2,它们的参数一样(差一个-d),故只列举bzip2

bzip2格式:bzip2 [参数] [file]
-c:将压缩或是解压缩的结果 送到标准输出,如果输出到屏幕上则是乱
-d:解压缩文件,同bunzip2 文件名.bz2
-f:有同名文件时强制覆盖
-k:解压缩后,不删除原来的压缩文件,默认会删除
-
q:安静模式,不会在屏幕上有任何输
-s:解压缩时降低内存的使用量,但是时间会增加
-t:测试解压缩效果,测试后会将解开的文件删除
-v:列出详细的信息
-z:强制压缩
-V或是-L:显示版本信息

bzip2示例:

# 压缩1.log
bzip2 1.log
bzip2 -k 1.log
# 解压1.log.bz2
bzip2 -d 1.log.bz2
bzip2 -dk 1.log.bz2
bunzip2 1.log.bz2
bunzip2 -k 1.log.bz2


3.tar命令详解:tar是一个打包工具并不能压缩文件。

-A--catenate:新增文件到以存在的备份文件;
-B:设置区块大小;
-c--create:建立新的备份文件
-C < 目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-d:记录文件的差别;
-x--extract--get:从备份文件中还原文件;
-t--list:列出备份文件的内容;
-z--gzip--ungzip:通过gzip指令处理备份文件;
-Z--compress--uncompress:通过compress指令处理备份文件;
-f< 备份文件>或--file=< 备份文件>:指定备份文件;
-v--verbose:显示指令执行过程;
-r:添加文件到已经压缩的文件;
-u:添加改变了和现有的文件到已经存在的压缩文件;
-j:支持bzip2解压文件;
-v:显示操作过程;
-l:文件系统边界设置;
-k:保留原有文件不覆盖;
-m:保留文件不被覆盖;
-w:确认压缩文件的正确性;
-p--same-permissions:用原来的文件权限还原文件;
-P--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
-N < 日期格式> 或 --newer=< 日期时间>:只将较指定日期更新的文件保存到备份文件里;
--exclude=< 范本样式>:排除符合范本样式的文件。


tar命令示例:

范例一:将整个  /etc  目录下的文件全部打包成为  /tmp/etc.tar
[root@linux~]# tar -cvf /tmp/etc.tar /etc <== 仅打包,不压缩!
[root@linux~]# tar -zcvf /tmp/etc.tar.gz /etc <== 打包后,以  gzip  压缩
[root@linux~]# tar -jcvf /tmp/etc.tar.bz2 /etc <== 打包后,以  bzip2  压缩
#  特别注意,在参数 f  之后的文件档名是自己取的,我们习惯上都用 .tar  来作为辨识。
#  如果加  z  参数,则以  .tar.gz  或  .tgz  来代表 gzip  压缩过的  tar file  ~
#  如果加  j  参数,则以  .tar.bz2  来作为附档名啊~
#  上述指令在执行的时候,会显示一个警告讯息:
#  『 tar: Removing leading `/' from member names 』那是关於绝对路径的特殊设定。
范例二:查阅上述  /tmp/etc.tar.gz  文件内有哪些文件?
[root@linux~]# tar -ztvf /tmp/etc.tar.gz
范例三:将  /tmp/etc.tar.gz  文件解压缩在  /usr/local/src  底下
[root@linux~]# cd /usr/local/src
[root@linuxsrc]# tar -zxvf /tmp/etc.tar.gz
#  在预设的情况下,可以将压缩档在任何地方解开的!以这个例来说,
#  先将工作目录变换到  /usr/local/src  底下,并且解开  /tmp/etc.tar.gz  ,
#  则解开的目录会在  /usr/local/src/etc  呢!另外,如果进入  /usr/local/src/etc
#  则会发现,该目录下的文件属性与  /etc/  可能会有所不同!
范例四:在  /tmp  底下,我只想要将  /tmp/etc.tar.gz  内的 etc/passwd解开而已
[root@linux~]# cd /tmp
[root@linuxtmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
#  我可以透过  tar -ztvf  来查阅  tarfile  内的文件名称,如果单只要一个文件,
#  就可以透过这个方式来下达!注意到!etc.tar.gz  内的根目录  /  是被拿掉了!
范例五:将  /etc/  内的所有文件备份下来,并且保存其权限!
[root@linux~]# tar -zxvpf /tmp/etc.tar.gz /etc
#    -p  的属性是很重要,尤其是要保留原本文件的属性时!
范例六:在  /home  当中,比  2005/06/01  新的文件才备份
[root@linux~]# tar -N '2005/06/01' -zcvf home.tar.gz /home
范例七:我要备份  /home, /etc  ,但不要  /home/dmtsai
[root@linux~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
范例八:将  /etc/  打包后直接解开在  /tmp  底下,而不产生文件!
[root@linux~]# cd /tmp
[root@linuxtmp]# tar -cvf - /etc | tar -xvf -
#  这个动作有点像是cp-r/etc /tmp  啦~依旧是有其有用途的!
#  要注意的地方在於输出档变成  -  而输入档也变成  -  ,又有一个  |  存在~
#  这分别代表 standard output, standard input  与管线命令!