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完成,file经gzip压缩后为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 与管线命令!