我通常使用tar zcvf
压缩并使用tar zxvf
解压缩(由于习惯使用gzip)。
我最近得到了一个具有超线程的四核CPU,所以我有8个逻辑核心,我注意到许多核心在压缩/解压缩期间未被使用。
有什么办法可以利用未使用的核心来加快速度吗?
您可以使用pigz而不是gzip,它在多个内核上执行gzip压缩。而不是使用-z选项,你将通过pigz管道:
tar cf - paths-to-archive | pigz > archive.tar.gz
默认情况下,pigz使用可用内核的数量,如果无法查询,则为8。您可以使用-p n请求更多信息,例如: -p 32. pigz与gzip具有相同的选项,因此您可以使用-9请求更好的压缩。例如。
tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
您还可以使用tar标志“--use-compress-program =”告诉tar要使用的压缩程序。
例如使用:
tar -c --use-compress-program=pigz -f tar.file dir_to_zip
有tar
计划的选项:
-I, --use-compress-program PROG
filter through PROG (must accept -d)
您可以使用多线程版本的归档程序或压缩程序实用程序。
最受欢迎的多线程归档器是pigz(而不是gzip)和pbzip2(而不是bzip2)。例如:
$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive
Archiver必须接受-d。如果替换实用程序没有此参数和/或您需要指定其他参数,则使用管道(如有必要,添加参数):
$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz
单线程和多线程的输入和输出是兼容的。您可以使用多线程版本进行压缩,并使用单线程版本进行解压缩,反之亦然。
对于压缩的p7zip,您需要一个小的shell脚本,如下所示:
#!/bin/sh
case $1 in
-d) 7za -txz -si -so e;;
*) 7za -txz -si -so a .;;
esac 2>/dev/null
保存为7zhelper.sh。这里的用法示例如下:
$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z
关于多线程XZ支持。如果您运行的是XZ Utils的5.2.0或更高版本,则可以通过环境变量XZ_DEFAULTS(例如-T
)将--threads
或XZ_DEFAULTS="-T 0"
设置为适当的值来利用多个内核进行压缩。
这是5.1.0alpha版本的一个人的片段:
多线程压缩和解压缩尚未实现,因此此选项暂时无效。
但是,对于尚未使用线程进行压缩的文件进行解压缩,这将不起作用。从版本5.2.2的man:
螺纹减压尚未实施。它仅适用于包含块头中具有大小信息的多个块的文件。以多线程模式压缩的所有文件都满足此条件,但即使使用--block-size = size,也不会以单线程模式压缩文件。
如果从源代码构建tar,则可以使用参数重新编译
--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
使用这些选项重新编译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
您可以将快捷方式-I
用于tar的--use-compress-program
开关,并在多个内核上调用pbzip2
进行bzip2压缩:
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
如果您希望在文件名和压缩选项方面具有更大的灵活性,可以使用:
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz
find
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec
此命令将查找要归档的文件,在本例中为/my/path/*.sql
和/my/path/*.log
。添加尽可能多的-o -name "pattern"
你想要的。
-exec
将使用find
的结果执行下一个命令:tar
tar
tar -P --transform='s@/my/path/@@g' -cf - {} +
--transform
是一个简单的字符串替换参数。它将从存档中删除文件的路径,以便tarball的根在提取时成为当前目录。请注意,您不能使用-C
选项来更改目录,因为您将失去find
的好处:将包含该目录的所有文件。
-P
告诉tar
使用绝对路径,因此它不会触发警告“从成员名称中删除前导'/'”。无论如何,领先'/'将由--transform
删除。
-cf -
告诉tar
使用我们稍后将指定的tarball名称
{} +
使用find
之前发现的每个文件
pigz
pigz -9 -p 4
根据需要使用尽可能多的参数。在这种情况下,-9
是压缩级别,-p 4
是专用于压缩的核心数。如果在负载很重的Web服务器上运行它,您可能不希望使用所有可用的核心。
> myarchive.tar.gz
最后。