Bzip2 和 gzip 仅使用一个内核,尽管许多计算机具有不止一个内核。但是有像 lbzip2、pbzip2 和 pigz 这样的程序,它们使用所有可用的内核并承诺与 bzip2 和 gzip 兼容。
那么默认情况下使用这些程序的最佳方法是什么,以便tar cfa file.tar.bz2 directory使用 lbzip2/pbzip2 而不是 bzip2?我当然不想破坏任何东西。
elm*_*cha 34
您可以将 bzip2、bunzip2 和 bzcat 符号链接到 lbzip2,将 gzip、gunzip、gzcat 和 zcat 符号链接到 pigz:
sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat
Run Code Online (Sandbox Code Playgroud)
我选择了 lbzip2 而不是 pbzip2,因为 /usr/share/doc/lbzip2/README.gz 看起来比 /usr/share/doc/pbzip2/README.gz“更好”。此外,tar 手册谈到了 lbzip2。
编辑:
包含在 Precise Pangolin 中的 pigz-2.1.6 拒绝解压缩带有未知后缀的文件(例如 initramfs-*.img)。这在 Quantal 附带的 pigz-2.2.4 中已修复。所以你可能要等到 Quantal,手动安装Quantal 包,或者先不要链接 gunzip/gzcat/zcat。
Bas*_*ing 34
符号链接的想法非常好。
另一个可行的解决方案是别名tar:
alias tar='tar --use-compress-program=pbzip2'
Run Code Online (Sandbox Code Playgroud)
或分别
alias tar='tar --use-compress-program=pigz'
Run Code Online (Sandbox Code Playgroud)
它创建了另一种默认值。
小智 14
符号链接答案确实不正确。它会将整个系统的默认 gzip(或 bzip2)替换为 pigz(或 pbzip2)。虽然并行实现与单进程版本非常相似,但命令行选项的细微差异可能会破坏依赖于这些差异的核心系统进程。
该--use-compress-program选项是一个更好的选择。
第二个选项(很像别名)是设置 GNU tar 支持的 TAR_OPTIONS 环境变量:
export TAR_OPTIONS="--use-compress-program=pbzip2"
tar czf myfile.tar.bz2 mysubdir/
Run Code Online (Sandbox Code Playgroud)
小智 5
一个有趣的选择是重新编译 tar 以默认使用多线程。复制自此stackoverflow 答案
如果从源代码构建 tar,则可以使用参数重新编译
--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
Run Code Online (Sandbox Code Playgroud)
使用这些选项重新编译 tar 后,您可以检查 tar 帮助的输出:
$ tar --help | grep "lbzip2\|plzip\|pigz"
-j, --bzip2 filter the archive through lbzip2
--lzip filter the archive through plzip
-z, --gzip, --gunzip, --ungzip filter the archive through pigz
Run Code Online (Sandbox Code Playgroud)