Linux下打包压缩命令
下面学习一下压缩和打包的相关命令,首先得先明确两个概念,即:压缩和打包 。我们实际使用中一般是打包和压缩结合的使用,为了学习下面简要的介绍一下压缩文件或目录的命令。
-
压缩:将文件或目录进行压强,使文件或目录大小变小。
-
打包:表示将目录中的所有内容,捆绑在一起,方便传输,打包后的文件会变大,不一定会变小。
gzip、gunzip
gzip即GNU zip,是GUN下的开源免费软件。gzip使用起来非常的简单,文件经它压缩过后,其名称后面会使用".gz"的扩展名。但是区别于windows下的winRAR,我们在Linux的所有压缩包放到windows下,winRAR都可以将它解压缩(也就是说windows的WinRAR什么格式的文件都支持,但是Linux就不一定支持了,当然你要安装相应的软件也可以,但是最好不要给自己制造麻烦),但是如果反过来,我们在windows下压缩包放到Linux下,就必须去找一个winRAR的Linux版本了。
特点
-
只能压缩文件,不能压缩目录。
-
不保留源文件 newfile1.gz newfile1不在了。
解压文件:
-
gunzip gunzip /prem/newfile1.gz 解压也是不能保留源文件的,会将被解压的.gz包自动删除 。
-
gzip -d(decompress表示解压) +压缩包名称。
gzip参数
-
-a或--ascii 使用ASCII文字模式。
-
-c或--stdout或--to-stdout 把压缩后的文件输出到标准输出设备,不去更动原始文件。
-
-d或--decompress或----uncompress 解开压缩文件。
-
-f或--force 强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。
-
-l或--list 列出压缩文件的相关信息。
-
-L或--license 显示版本与版权信息。
-
-n或--no-name 压缩文件时,不保存原来的文件名称及时间戳记。
-
-N或--name 压缩文件时,保存原来的文件名称及时间戳记。
-
-q或--quiet 不显示警告信息。
-
-r或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-
-S<压缩字尾字符串>或----suffix<压缩字尾字符串> 更改压缩字尾字符串。
-
-t或--test 测试压缩文件是否正确无误。
-
-v或--verbose 显示指令执行过程。
-
-<压缩效率> 压缩效率是一个介于1-9的数值,预设值为"6",指定愈大的数值,压缩效率就会愈高。
-
--best 此参数的效果和指定"-9"参数相同。
-
--fast 此参数的效果和指定"-1"参数相同。
gunzip命令参数
-
-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 显示指令执行过程。
使用举例
把test目录下的文件压缩:
[root@hpf-linux test]# ls -lh
总用量 1.5M
-rw-------. 1 root root 403K 3月 18 23:09 messages
-rw-------. 1 root root 202K 3月 18 23:09 messages-20160131
-rw-------. 1 root root 202K 3月 18 23:09 messages-20160207
-rw-------. 1 root root 405K 3月 18 23:09 messages-20160312
-rw-------. 1 root root 316K 3月 18 23:09 messages-20160313
-rwxr-xr--. 1 root root 0 3月 15 23:17 test.sh
[root@hpf-linux test]# gzip *
[root@hpf-linux test]# ls -lh
总用量 208K
-rw-------. 1 root root 26K 3月 18 23:09 messages-20160131.gz
-rw-------. 1 root root 26K 3月 18 23:09 messages-20160207.gz
-rw-------. 1 root root 52K 3月 18 23:09 messages-20160312.gz
-rw-------. 1 root root 41K 3月 18 23:09 messages-20160313.gz
-rw-------. 1 root root 51K 3月 18 23:09 messages.gz
-rwxr-xr--. 1 root root 28 3月 15 23:17 test.sh.gz
显示每个压缩的文件的信息:
[root@hpf-linux test]# gzip -l *
compressed uncompressed ratio uncompressed_name
26226 206562 87.3% messages-20160131
26235 206250 87.3% messages-20160207
52459 413752 87.3% messages-20160312
41594 323420 87.2% messages-20160313
51914 411945 87.4% messages
28 0 0.0% test.sh
198456 1561929 87.3% (totals)
bzip2与bunzip2
bzip2采用新的压缩演算法,压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除原始的文件。
bzip2命令选项
-
-c或--stdout 将压缩与解压缩的结果送到标准输出。
-
-d或--decompress 执行解压缩。
-
-f或--force bzip2在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖,请使用此参数。
-
-k或--keep bzip2在压缩或解压缩后,会删除原始的文件。若要保留原始文件,请使用此参数。
-
-s或--small 降低程序执行时内存的使用量。
-
-t或--test 测试.bz2压缩文件的完整性。
-
-v或--verbose 压缩或解压缩文件时,显示详细的信息。
-
-z或--compress 强制执行压缩。
-
-L,--license,
-
--repetitive-best 若文件中有重复出现的资料时,可利用此参数提高压缩效果。
-
--repetitive-fast 若文件中有重复出现的资料时,可利用此参数加快执行速度。
-
-压缩等级 压缩时的区块大小。
bunzip2命令参数
-
-f或--force 解压缩时,若输出的文件与现有文件同名时,预设不会覆盖现有的文件。若要覆盖,请使用此参数。
-
-k或--keep 在解压缩后,预设会删除原来的压缩文件。若要保留压缩文件,请使用此参数。
-
-s或--small 降低程序执行时,内存的使用量。
-
-v或--verbose 解压缩文件时,显示详细的信息。
zip与unzip
zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名的压缩文件。而解压此类文件需要unzip命令来进行解压。
语 法
zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>]
zip命令参数
-
-A 调整可执行的自动解压缩文件。
-
-b<工作目录> 指定暂时存放文件的目录。
-
-c 替每个被压缩的文件加上注释。
-
-d 从压缩文件内删除指定的文件。
-
-D 压缩文件内不建立目录名称。
-
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-
-F 尝试修复已损坏的压缩文件。
-
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-
-i<范本样式> 只压缩符合条件的文件。
-
-j 只保存文件名称及其内容,而不存放任何目录名称。
-
-J 删除压缩文件前面不必要的数据。
-
-k 使用MS-DOS兼容格式的文件名称。
-
-l 压缩文件时,把LF字符置换成LF+CR字符。
-
-ll 压缩文件时,把LF+CR字符置换成LF字符。
-
-L 显示版权信息。
-
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。
-
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-
-q 不显示指令执行过程。
-
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-
-S 包含系统和隐藏文件。
-
-t<日期时间> 把压缩文件的日期设成指定的日期。
-
-T 检查备份文件内的每个文件是否正确无误。
-
-u 更换较新的文件到压缩文件内。
-
-v 显示指令执行过程或显示版本信息。
-
-V 保存VMS操作系统的文件属性。
-
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。
-
-x<范本样式> 压缩时排除符合条件的文件。
-
-X 不保存额外的文件属性。
-
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-
-z 替压缩文件加上注释。
-
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
-
-<压缩效率> 压缩效率是一个介于1-9的数值。
unzip命令参数
-
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-
-f 更新现有的文件。
-
-l 显示压缩文件内所包含的文件。
-
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-
-t 检查压缩文件是否正确。
-
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-
-v 执行是时显示详细的信息。
-
-z 仅显示压缩文件的备注文字。
-
-a 对文本文件进行必要的字符转换。
-
-b 不要对文本文件进行字符转换。
-
-C 压缩文件中的文件名称区分大小写。
-
-j 不处理压缩文件中原有的目录路径。
-
-L 将压缩文件中的全部文件名改为小写。
-
-M 将输出结果送到more程序处理。
-
-n 解压缩时不要覆盖原有的文件。
-
-o 不必先询问用户,unzip执行后覆盖原有文件。
-
-P<密码> 使用zip的密码选项。
-
-q 执行时不显示任何信息。
-
-s 将文件名中的空白字符转换为底线字符。
-
-V 保留VMS的文件版本信息。
-
-X 解压缩时同时回存文件原来的UID/GID。
-
[.zip文件] 指定.zip压缩文件。
-
[文件] 指定要处理.zip压缩文件中的哪些文件。
-
-d<目录> 指定文件解压缩后所要存储的目录。
-
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-
-Z unzip -Z等于执行zipinfo指令。
使用举例
把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:
# zip -r yasuo.zip abc.txt dir1
解压缩:
# unzip yasuo.zip
我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:
# unzip abc?.zip
注释:?表示一个字符,如果用*表示任意多个字符。
我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:
# unzip -v large.zip
我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了
# unzip -t large.zip
我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:
# unzip -j music.zip
xz
XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩速度也很快。最初 XZ Utils 的是基于 LZMA-SDK 开发,但是 LZMA-SDK 包含了一些 WINDOWS 平台的特性,所以 XZ Utils 为以适应 POSIX 平台作了大幅的修改。XZ Utils 的出现也是为了取代 POSIX 系统中旧的 LZMA Utils。
参数
-
-z 压缩,而且这是默认的操作,也就是说没有操作数的话 xz 加上文件就是压缩!(unxz 可以用来解压)
-
-d 解压缩。和 -z 效果相反
-
-t, --test 测试压缩文件的完整性,这个操作不会生成解压缩文件。
-
-l, --list 这个操作会打印文件的信息,不会生成解压缩文件!
-
-k 保持源文件不被删除
举例
压缩一个文件 test.txt,压缩成功后生成 test.txt.xz, 原文件会被删除。
[root@hpf-linux test]# xz messages
[root@hpf-linux test]# ls
messages-20160131 messages-20160207 messages-20160312 messages-20160313 messages.xz test.sh
解压 test.txt.xz 文件,并使用参数 -k 保持原文件不被删除:
[root@hpf-linux test]# xz -k messages
[root@hpf-linux test]# ls
messages messages-20160131 messages-20160207 messages-20160312 messages-20160313 messages.xz test.sh
使用参数 -l 显示 .xz 文件的基本信息。基本信息包括压缩率、数据完整性验证方式等。也可以和参数 -v 或 -vv 配合显示更详尽的信息。
$ xz -l index.txt.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 768 B 1,240 B 0.619 CRC64 index.txt.xz
使用参数 -0, -1, -2, … -6, … -9 或参数 --fast, --best 设定压缩率。xz 命令的默认为 -6 ,对于大多数系统来说,甚至是一些较旧的系统,-4 … -6 压缩率预设值都不错的表现。
$ xz -k7 xz_pipe_decomp_mini.c
$ xz -k --fast xz_pipe_decomp_mini.c
和 tar 命令配合处理多个文件。一般来说,有两种简单的方法将 tar 和 xz 结合起来,一是使用管道,或是使用 tar 命令的参数'J'。两种方法各自有各自的优点,第一种方法可以充分利用 xz 利用丰富的参数。而第二种方法使用起来更简单容易。
详细参考
tar
tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。 为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩。
常见解压/压缩命令
tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
.xz
压缩:xz FileName
解压:xz -d FileName.xz
tar.xz
压缩:tar Jcvf FileName.tar.xz DirName
解压:tar Jxvf FileName.tar.xz
应用举例
将文件全部打包成tar包:
[root@hpf-linux test]# tar -cvf messages1.tar messages
messages
[root@hpf-linux test]# tar -cvzf messages1.tar.gz messages
messages
[root@hpf-linux test]# tar -jcvf messages1.tar.bz2 messages
messages
[root@hpf-linux test]# tar -Jcvf messages1.tar.xz messages
messages
[root@hpf-linux test]# file messages1.tar
messages1.tar: POSIX tar archive (GNU)
[root@hpf-linux test]# file messages1.tar.gz
messages1.tar.gz: gzip compressed data, from Unix, last modified: Sun Mar 20 21:32:37 2016
[root@hpf-linux test]# file messages1.tar.bz2
messages1.tar.bz2: bzip2 compressed data, block size = 900k
[root@hpf-linux test]# file messages1.tar.xz
messages1.tar.xz: xz compressed data
说明:
tar -cvf messages1.tar messages 仅打包,不压缩!
tar -zcvf messages1.tar.gz messages 打包后,以 gzip 压缩
tar -jcvf messages1.tar.bz2 messages 打包后,以 bzip2 压缩
tar -Jcvf messages1.tar.xz messages 打包后,以 xz 压缩
在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。
查阅上述 tar包内有哪些文件:
[root@hpf-linux test]# tar -jtvf messages1.tar.gz
bzip2: (stdin) is not a bzip2 file.
tar: Child returned status 2
tar: Error is not recoverable: exiting now
[root@hpf-linux test]# tar -ztvf messages1.tar.gz
-rw------- root/root 411945 2016-03-18 23:09 messages
[root@hpf-linux test]# tar -Jtvf messages1.tar.xz
-rw------- root/root 411945 2016-03-18 23:09 messages
由于我们使用 gzip 压缩的messages1.tar.gz,所以要查阅messages1.tar.gz包内的文件时,就得要加上 z 这个参数了,同理查看messages1.tar.xz包内的内容就要用J参数。
只将 打包内容内的部分文件解压出来:
[root@hpf-linux test]# tar -cvzf messages.tar.gz messages-20160207 messages-20160313
messages-20160207
messages-20160313
[root@hpf-linux test]# tar -tvzf messages.tar.gz
-rw------- root/root 206250 2016-03-18 23:09 messages-20160207
-rw------- root/root 323420 2016-03-18 23:09 messages-20160313
[root@hpf-linux test]# cp messages.tar.gz ../tartest/
[root@hpf-linux test]# cd ../tartest/
[root@hpf-linux tartest]# ls
messages.tar.gz
[root@hpf-linux tartest]# tar -xzvf messages.tar.gz messages-20160207
messages-20160207
[root@hpf-linux tartest]# ls -lh
总用量 272K
-rw-------. 1 root root 202K 3月 18 23:09 messages-20160207
-rw-r--r--. 1 root root 67K 3月 20 21:50 messages.tar.gz
将文件解压到一个指定的目录或路径:
[root@hpf-linux tartest]# tar -xvzf messages.tar.gz -C /tmp/
messages-20160207
messages-20160313
[root@hpf-linux tartest]# ls /tmp/messages-20160*
/tmp/messages-20160207 /tmp/messages-20160313
使用通配符来解压多个文件:
# tar -xz -f abc.tar.gz --wildcards "*.txt"
在添加文件之前进行确认:
一个有用的选项是“w”,该选项使得tar命令在添加每个文件到归档文件之前来让用户进行确认,有时候这会很有用。 使用该选项时,只有用户输入“y”时的文件才会被加入到归档文件中,如果你不输入任何东西,其默认表示是一个“n”。
# tar -czw -f abc.tar.gz ./new/*
通过tar来进行备份:
一个真实的场景是在固定的时间间隔内来备份目录,tar命令可以通过cron调度来实现这样的一个备份,以下是一个样例 :
# tar -cvz -f archive-$(date +%Y%m%d).tar.gz ./new/
使用cron来运行上述的命令会保持创建类似以下名称的备份文件 :'archive-20150218.tar.gz'。 当然,需要确保日益增长的归档文件不会导致磁盘空间的溢出。
加入文件到存在的归档文件中 :
“r”选项可以被用来将文件加入到已存在的归档文件中,而不用创建一个新的归档文件,下面是一个简单的样例:
# tar -rv -f abc.tar abc.txt
注意:文件并不能加入到已压缩的归档文件中(gz 或 bzip)。文件只能被加入到普通的归档文件中。
将文件加入到压缩的归档文件中(tar.gz/tar.bz2):
之前已经提到了不可能将文件加入到已压缩的归档文件中,然而依然可以通过简单的一些把戏来完成。使用gunzip命令来解压缩归档文件,然后将文件加入到归档文件中后重新进行压缩。
# gunzip archive.tar.gz
# tar -rf archive.tar ./path/to/file
# gzip archive.tar
在文件夹当中,比某个日期新的文件才备份:
# tar -N "2012/11/13" -zcvf log17.tar.gz test
备份文件夹内容是排除部分文件:
[root@hpf-linux tmp]# tree tartest/
tartest/
├── messages-20160207
├── messages-20160313
└── messages.tar.gz
0 directories, 3 files
[root@hpf-linux tmp]# tar --exclude messages.tar.gz -cvzf /tmp/tartest.tar.gz tartest/
tartest/
tartest/messages-20160313
tartest/messages-20160207
[root@hpf-linux tmp]# tar -tzvf tartest.tar.gz
drwxr-xr-x root/root 0 2016-03-20 22:21 tartest/
-rw------- root/root 323420 2016-03-18 23:09 tartest/messages-20160313
-rw------- root/root 206250 2016-03-18 23:09 tartest/messages-20160207