bzip2

使用Burrows-Wheeler块排序文本压缩算法,将文件进行压缩,压缩比率比一般算法高一些。bzip2要求命令行标志附带一个文件名列表。每个文件都被自己的压缩版本替换,名称为“original_name.bz2”。每个压缩文件与相应的原始文件具有相同的修改日期、权限和所有权(如果可能的话),因此可以在解压缩时正确地还原这些属性。

默认情况下,bzip2和bunzip2不会覆盖现有文件。如果希望发生这种情况,请指定“-f”标志。如果没有指定文件名,bzip2将从标准输入压缩到标准输出。在这种情况下,bzip2拒绝将压缩输出写入终端,因为这将是完全不可理解的,因此毫无意义。

bunzip2(或bzip2 -d)解压缩所有指定的文件。未由bzip2创建的文件将被检测和忽略,并发出警告。bzip2试图从压缩文件中猜测解压缩文件的文件名,如下所示:

filename.bz2    becomes  filename

filename.bz     becomes  filename

filename.tbz2   becomes  filename.tar

filename.tbz    becomes  filename.tar

anyothername    becomes  anyothername.out

如果文件没有以.bz2、.bz、.tbz2或.tbz中的某个结尾,bzip2抱怨它无法猜测原始文件的名称,并使用原始名称并附加.out。与压缩一样,不提供文件名会导致从标准输入到标准输出的解压缩。bunzip2将正确解压缩一个文件,该文件是两个或多个压缩文件的级联。其结果是连接相应的未压缩文件。还支持连接压缩文件的完整性测试(-t)。

还可以通过赋予“-c”标志将文件压缩或解压缩到标准输出。可以像这样压缩和解压缩多个文件。结果输出按顺序输入到stdout。以这种方式压缩多个文件会生成包含多个压缩文件表示的流。这样的流只能通过bzip2版本0.9.0或更高版本正确地解压缩。在解压缩流中的第一个文件后,bzip2的早期版本将停止。

bzcat(或bzip2 -dc)将所有指定的文件解压到标准输出。bzip2将按照这个顺序从环境变量BZIP2和BZIP读取参数,并在从命令行读取任何参数之前对它们进行处理。这为提供默认参数提供了一种方便的方法。

压缩总是被执行,即使压缩文件比原始文件稍大。小于100个字节的文件往往会变大,因为压缩机制在50个字节的范围内有一个恒定的开销。随机数据(包括大多数文件压缩器的输出)编码大约为每字节8.05位,扩展幅度约为0.5%。

bzip2使用32位crc来确保解压缩版本的文件与原始文件相同。这可以防止压缩数据的损坏,防止bzip2中未被检测到的bug(希望非常不可能)。数据损坏的可能性是微乎其微的,大约每处理40亿个文件就有一个机会。但是,请注意,检查是在解压时发生的,因此它只能告诉您某些事情是错误的。它无法帮助您恢复原始未压缩数据。您可以使用bzip2recover尝试从损坏的文件中恢复数据。

返回值:0表示正常退出,1表示环境问题(文件未找到,无效标志,I/O错误,&c),2表示损坏的压缩文件,3表示内部一致性错误(例如,bug),导致bzip2恐慌。

此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法

     bzip2 [ -cdfkqstvzVL123456789 ]  [ filenames ...  ]

 

2、选项列表

选项

说明

-h | --help

帮助信息

-V | --version

显示命令版本信息

-c | --stdout

将解压或者解压文件写到标准输出

-d | --decompress

解压

--z | -compress

对-d的补充:强制压缩,而不管调用名称如何

-t | --test

检查指定文件的完整性,但不要解压缩它们。这确实执行了一次尝试解压缩,并丢弃了结果。

-f | --force

强制执行

-k | --keep

解压之后,保留源文件

-s | --small

减少内存使用,用于压缩、解压缩和测试。使用修改的算法对文件进行解压缩和测试,该算法每个块字节只需要2.5字节。这意味着任何文件都可以在2300 k内存中解压缩,尽管速度是正常速度的一半。

在压缩期间,-s选择200 k的块大小,这将内存的使用限制在大约相同的数字上,而代价是压缩比。简而言之,如果你的机器内存不足(8兆字节或更少),那就用-s来做所有的事情。请参阅下面的内存管理。

-L | --license | -V | --version

列出gzip的许可证

-q | --quite

跳过所有的警告信息

-v | --verbose

显示详细执行过程

-1 ~-9

指定压缩比率,将块大小设为100k,200k,900K。解压时无效,“-1”等价于“--fast”,“-9”等价于“--best“。

-v | --verbose

显示执行过程

--

将所有后续参数视为文件名,即使它们以‘-’开头。这样您就可以处理以‘-’开头的文件,例如:“bzip2  --  -myfilename”。

--repetitive-fast

--repetitive-best

这些标志在0.9.5及以上版本中是多余的。它们对早期版本中排序算法的行为提供了一些粗略的控制,这有时是有用的。0.9.5及以上版本的改进算法使这些标志不相关

 

3、内存管理

bzip2以块压缩大型文件。块大小既影响压缩比,也影响压缩和解压缩所需的内存量。标志-1到-9指定块大小分别为100000字节至900000字节(默认值)。解压缩时,从压缩文件的头读取用于压缩的块大小,然后为其分配足够的内存来解压缩文件。由于块大小存储在压缩文件中,因此在解压缩过程中,标志-1至-9与此无关,因而被忽略。压缩和解压缩需求(以字节为单位)可估计为

Compression:   400k + ( 8 x block size )

Decompression: 100k + ( 4 x block size ), or 100k + ( 2.5 x block size )

更大的区块大小给出迅速递减的边际回报。大部分压缩来自块大小的前两三百k,在小型机器上使用bzip 2时要记住这一点。同样重要的是要认识到,解压缩内存需求是通过选择块大小在压缩时间设置的。

对于默认的900k块大小压缩的文件,bunzip2需要大约3700千字节来解压缩。为了支持对4MB机器上的任何文件进行解压缩,bunzip2可以选择使用大约一半的内存(约2300千字节)来解压缩。解压缩速度也减半,因此您应该只在必要时使用此选项。相关的标志是-s。通常,尝试并使用允许的最大块大小的内存约束,因为这样可以最大限度地实现压缩。压缩和解压缩速度几乎不受块大小的影响。

另一个要点适用于适合单个块的文件,意味着大多数使用大块大小的文件。接触到的实际内存量与文件大小成正比,因为文件小于块。例如,使用标志-9压缩一个文件的长度为20000字节,将导致压缩器分配大约7600k的内存,但只会触及400k+20000*8=56万字节的内存。类似地,解压缩程序将分配3700k,但只会触及100k+20000*4=180 k字节。

下面是一个表,它总结了不同块大小的最大内存使用量

Compress     Decompress       Decompress       Corpus

Flag             usage      usage       -s usage     Size

-1               1200k       500k         350k      914704

-2               2000k       900k         600k      877703

-3               2800k      1300k         850k      860338

-4               3600k      1700k        1100k      846899

-5               4400k      2100k        1350k      845160

-6               5200k      2500k        1600k     838626

-7               6100k      2900k        1850k      834096

-8               6800k      3300k        2100k      828642

-9               7600k      3700k        2350k      828642

4、从损坏的文件中恢复数据

bzip2以块的形式压缩文件,通常长达900千字节。每个块都是独立处理的。如果媒体或传输错误导致multi-block .bz2文件损坏,则可以从文件中未损坏的块恢复数据。每个块的压缩表示由一个48位模式分隔,这使得以合理的确定性找到块边界成为可能。每个块还带有自己的32位CRC,因此损坏的块可以与未损坏的块区分开来。

bzip2Recovery是一个简单的程序,其目的是搜索“.bz2”文件中的块,并将每个块写入自己的“.bz2”文件中。然后可以使用“bzip2  –t”测试结果文件的完整性,并解压缩未损坏的文件。

bzip2Recovery接受一个参数,即受损文件的名称,并写入一些文件“rec00001file.bz2”、“rec00002file.bz2”等,其中包含提取的块。输出文件名的设计使得在随后的处理中使用通配符。例如,“bzip2  -dc  rec*file.bz2  >  recovered_data”按正确的顺序处理文件。

处理大型bz2文件时,bzip2恢复应该是最有用的,因为这些文件将包含许多块。在损坏的单块文件上使用它显然是徒劳无功的,因为损坏的块无法恢复。如果希望通过媒体或传输错误最大限度地减少任何潜在的数据丢失,可以考虑使用较小的块大小进行压缩。

5、执行情况说明

压缩的排序阶段收集文件中类似的字符串。正因为如此,包含大量重复符号的文件,如“aabaabaabaab.”(重复几百次)可能比正常压缩速度慢。在这方面,0.9.5及以上的版本比以前的版本要好得多。最坏压缩时间与平均压缩时间之比在10:1左右.对于以前的版本,这个数字更像是100:1。如果需要,可以使用-vvvv选项来非常详细地监视进度。减压速度不受这些现象的影响。

bzip 2通常分配几兆字节的内存进行操作,然后以相当随机的方式对其进行充电。这意味着压缩和解压缩的性能在很大程度上取决于您的机器能够为缓存丢失提供服务的速度。正因为如此,通过对代码进行小幅度的更改以降低漏出率,从而提供了不成比例的大幅度性能改进。我认为bzip 2在具有非常大缓存的机器上表现最好。

7、实例

1)压缩文件

[root@localhost weijie]# bzip2 1.c                   //压缩1.c,源文件会被删除

[root@localhost weijie]# ls

11.c  1.c.bz2  2.c  3.c  4.c  5.c  6.c~  bak

[root@localhost weijie]# bzip2 -c 2.c > res.bz2     //1.c压缩到res,源文件不动

[root@localhost weijie]# ls

11.c  1.c.bz2  2.c  3.c  4.c  5.c  6.c~  bak  res.bz2

2)解压

[root@localhost weijie]# bzip2 -d res.bz2            //解压

[root@localhost weijie]# ls

11.c  1.c.bz2 2.c  3.c  4.c 5.c  6.c~  bak res

3)将两个文件压缩到一个文件中

[root@localhost weijie]# cat 1.c 2.c                   //输出两个文件的内容

hello world, 

i am david. 

i love linux, 

love code.

123

23

212

[root@localhost weijie]# bzip2 –c 1.c > foo.gz        //1.c压缩到foo

[root@localhost weijie]# bzip2 –c 2.c >> foo.gz       //2.c压缩到foo

[root@localhost weijie]# bgzip2 -d foo.gz              //解压foo

[root@localhost weijie]# cat foo                        //显示foo的内容

hello world, 

i am david. 

i love linux, 

love code.

123

23

212

做了一个Linux学习的平台,目前出来一个雏形,各位可以参考使用
链接:https://pan.baidu.com/s/1GOLVU2CbpBNGtunztVpaCQ  密码:n7bk

linux基础命令---bzip2的更多相关文章

  1. 【Python之路】第一篇--Linux基础命令

    pwd 命令 查看”当前工作目录“的完整路径 pwd -P # 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 .   表示当前目录 ..  表示上级目录 /  表示根目录 ls ...

  2. 常用的linux基础命令

    常用的linux基础命令 1.ls 显示目录属性 -l:(也可以简写成ll),列表显示权限等属性 -a:显示所有文件包括隐藏文件等 -d:只列出目录本身 2.chgrp 改变档案所属群组 eg:chg ...

  3. Linux基础命令-查看基本硬件信息

    Linux基础命令-查看基本硬件信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看CPU信息 [root@node101.yinzhengjie.org.cn ~]# l ...

  4. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  5. Linux基础命令小结(超全!!)

    Linux目录结构 1.bin 存放经常使用的指令比如ll,cp 2.sbin 系统管理员使用的系统管理指令 3.home 存放普通用户的住目录 4.root 系统管理员的用户主目录 5.boot 存 ...

  6. Linux基础命令整合

    linux基础命令整理 1.系统相关命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minu ...

  7. 第四节,Linux基础命令

    第四节,Linux基础命令 命令是系统操作员对系统传入的指令,传入指令后回车,系统接收到指令做出相应的行为 1.查看用户位于系统什么位置 [pmd]检查操作用户位于系统的什么位置 命令         ...

  8. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  9. 2.Linux基础命令

    linux内一切皆文件,没有文件夹只有目录,目录也是一种文件 1.一些常用按键: 将鼠标的光标从虚拟机里切换回来:Ctrl+Alt 拖动Ubuntu内的对话框:Alt键+鼠标左键拖动 清屏:Ctrl+ ...

随机推荐

  1. wordpress---wp_query的使用方法

    wp_query是一个wordpress用于复杂请求的的一个类,看到query懂开发的人就会反应这个是数据库查询的一个类,这个类可谓是非常有用的,可以帮助我们做很多复杂的查询. wp_query的使用 ...

  2. Django之ContentType详解

    contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. models.py文件的表结构写好后,通过makemigr ...

  3. django之admin设置

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索总结出比较实用的配置.若你有什么比较好的配置 ...

  4. 9.6Django

    2018-9-6 12:56:32 2018-9-6 18:32:22 把那个用户列表的页面优化了一下!用了老师更好看的页面,但是功能还是那些! 就是修改一下url就好! 放在我我的github  : ...

  5. java字符串的替换

    split也是用到了正则表达式 replace 是没有用正则表达式,全部替换 replaceAll 和replaceFirst是用了正则表达式 replaceAll替换所有,replaceFirst是 ...

  6. 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】

    题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...

  7. Codeforces Round #435 (Div. 2)

    A. Mahmoud and Ehab and the MEX 题目链接:http://codeforces.com/contest/862/problem/A 题目意思:现在一个数列中有n个数,每个 ...

  8. Centralized Cache Management in HDFS

    Overview(概述) Centralized cache management in HDFS is an explicit caching mechanism that allows users ...

  9. Oracle数据库返回字符类型-1~1的结果处理

    如果实体类中定义的字段是String类型,Oracle数据库中返回的是数字类型,那么Oracle返回0.xxx的时候会丢失前面的0. 要想不丢失0,那么数据库返回的就要是字符串类型的,所以要将返回值转 ...

  10. mysql 备份脚本

    #!/bin/bash cd /data/backup/www /usr/bin/mysqldump -u root --password=root www > /data/backup/www ...