使用tar时如何设置bzip2块大小?


9

tar用来将Linux服务器备份到磁带上。我正在使用-j选项使用压缩文件bzip2,但是找不到从tar调整bzip2的块大小选项的方法。默认块大小为900,000字节,压缩效果最佳,但最慢。我对压缩率不那么在意,因此希望以较小的块大小使bzip2运行更快。


1
旁注:最近我几乎放弃了bzip2。我使用lzma(来自lzma,lzma-utils或lzma-sdk包,名称取决于您的发行版。)在相同的CPU时间下,它通常会压缩相同或比bzip2更好的压缩效果;而当涉及到解压缩时,它只会吹bzip2远。
MihaiLimbăşan,2009年

Answers:


9
export BZIP=--fast
tar cjf foo.tar.bz2 foo

或通过管道将输出tar传递到bzip2

尽管您应该从bzip2手册页中注意到:

    -1(或--fast)至-9(或--best)
              压缩时将块大小设置为100 k,200 k ... 900 k。
              解压缩时无效。请参阅下面的内存管理。
              --fast和--best别名主要用于GNU gzip compat-
              的能力。特别是,--fast不会使事情有意义-
              更快。而--best仅选择默认行为。

您可以如何使用导出BZIP = -9的替代方法
波尔·哈伦

4
tar -cjf dir.tar.bz2 --options bzip2:compression-level=9 path/to/dir/

在我的系统(OSX El Capitan bsdtar 2.8.3)上,手册页中没有此内容(尽管列出了gzip:compression-level和xz:compression-level),但是对其进行测试确实有效。
steveayre

tar: unrecognized option '--options'
ZN13

2

bzip2 块大小

bzip2有一些块大小选项。从手册页bzip2(1)

-1 (or --fast) to -9 (or --best)
       Set the block size to 100 k, 200 k ..  900 k when compressing.
       Has no effect when decompressing. See MEMORY MANAGEMENT below.
       The --fast and --best aliases are primarily for GNU gzip
       compatibility. In particular, --fast doesn't make things
       significantly faster. And --best merely selects the default
       behaviour.

由于您希望更快地进行压缩,而无需考虑压缩率,因此bzip2,您似乎需要-1(或--fast)选项。

bzip2使用时设置块大小tar

您可以bzip2通过tar两种方式设置块大小。

UNlX方式

我最喜欢的方式是UNlX方式,您可以独立使用每种工具,然后通过管道将它们组合在一起。

$ tar --create [FILE...] | bzip2 -1 > [ARCHIVE].tar.bz2

您可以将其读为“使用tar-> 用-> bzip将.tar创建为->并将其bzip2写入[ARCHIVE].tar.bz2”。

环境变量

也可以bzip2通过环境变量设置选项BZIP2。从手册页bzip2(1)

bzip2 will read arguments from the environment variables BZIP2 and BZIP,
in that order, and will process them before any arguments read from the
command line. This gives a convenient way to supply default arguments.

因此,将其与一起使用tar,您可以例如执行以下操作:

$ BZIP2=-1 tar --create --bzip2 --file [ARCHIVE].tar.bz2 [FILE...]

更快的替代品

bzip2使用慢速压缩算法。如果您担心速度,可以研究其他算法,例如gzip或使用的算法lzop。这是一篇比较压缩工具的好文章:https : //aliver.wordpress.com/2010/06/22/huge-unix-file-compresser-shootout-with-tons-of-datagraphs/


看来您可能已在此处提供了良好的答案,但是请考虑阅读我如何编写一个良好的答案?在我们的帮助中心中,然后修改答案。从技术上讲,您的命令/代码/设置可能是解决方案,但欢迎您提供一些解释。提前致谢。
HBruijn

1

tar输出发送到stdout,然后bzip2分别通过管道传输:

% tar cvf - _file_ | bzip2 _opts_ > output.tar.bz2

0

它甚至更容易:

% tar -cvf dir.tar path/to/dir/ && bzip2 -9 dir.tar

3
使用临时文件意味着您需要足够的硬盘空间,以及用于tar写入和bzip2读取它的带宽。对于少量数据而言,这似乎微不足道,但是当所涉及的目录具有数百GB的数据时,它可能会成为一个真正的问题。
Ansgar Esztermann

对了谢谢。我知道学习了更深层次的原因tar-z-j。这些选择对我来说似乎很方便。但是他们可以节省一天。
Andreas Spindler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.