xz 是另一种通用数据压缩工具,其语法类似于较旧且更流行的 gzip 和 bzip2 选项。
使用 xz,我们通常会获得更好的压缩比。
在开始之前,我们需要安装 xz 包,默认情况下通常已经安装了它。
RHEL:
yum install xz
Debian:
apt-get install xz-utils
XZ 命令示例
- 压缩单个文件
这将压缩 file.txt 并创建 file.txt.xz,注意这将删除原始 file.txt 文件。
- 压缩单个文件
xz file.txt
- 2.一次压缩多个文件
这将压缩命令中指定的所有文件,再次注意,这会将 file1.txt、file2.txt 和 file3.txt 指定的原始文件删除为 file1.txt.xz、file2.txt.xz 和 file3.txt。 xz
xz file1.txt file2.txt file3.txt
要压缩目录中的所有文件,请参见下面的示例 10.
- 压缩单个文件,保留原文件
我们可以改为保留原始文件并使用 -k 或者 --keep 标志创建压缩副本。
- 压缩单个文件,保留原文件
xz -k file.txt
这也可以使用 -c 标志来完成,如下所示。
xz -c file.txt > file.txt.xz
-c 标志将 file.txt 的压缩副本输出到 stdout,然后将其发送到 file.txt.xz,从而保留原始 file.txt 文件。
- 4.解压一个xz压缩文件
要反转压缩过程并取回已压缩的原始文件,我们可以使用 xz 命令本身或者 unxz,它也是 xz 包的一部分。
xz -d file.txt.xz
或者
unxz file.txt.xz
这两个命令都会产生相同的结果,将 file.txt.xz 解压缩为 file.txt,删除压缩的 file.txt.xz 文件。
与示例 3 类似,可以解压缩文件并保留原始 .xz 文件,如下所示。
unxz -k file.txt.xz
- 列出压缩信息
使用 -l 或者 --list 标志,我们可以看到有关压缩 .xz 文件的有用信息,例如文件的压缩和未压缩大小以及压缩率,这向我们展示了压缩节省了多少空间。
- 列出压缩信息
[jack@onitroad ~]# xz -l linux-3.18.19.tar.xz Strms Blocks Compressed Uncompressed Ratio Check Filename 1 1 79.7 MiB 553.9 MiB 0.144 CRC64 linux-3.18.19.tar.xz
- 详细信息
可以指定 -v 或者 --verbose 标志以提供有关正在运行的操作的最新信息。在下面的例子中,我们使用 xz 和 -v 来压缩 Linux 内核,它向我们展示了当前的百分比、压缩率、MB/s、经过的时间和估计的完成时间,这是非常有用的信息,尤其是在压缩大文件时.
- 详细信息
[jack@onitroad test]# time xz -v linux-3.18.19.tar linux-3.18.19.tar (1/1) 21.4 % 18.6 MiB / 118.6 MiB = 0.157 1.3 MiB/s 1:28 5 min 30 s
这仅适用于具有已知大小的文件,如果我们将内容通过管道传输到 xz,它将不起作用。
- 调整压缩级别
使用 xz 应用于文件的压缩级别可以指定为 0(较少压缩)和 9(最佳压缩)之间的值。使用选项 0 将完成得更快,但压缩节省的空间不是最佳的。使用选项 9 将需要更长的时间才能完成,但是我们将节省最多的空间。
下面的示例比较了 -0 和 -9 之间的差异,如图所示,虽然 -0 完成得更快,但压缩量减少了约 6%(大约需要多出 37mb 的空间)。
- 调整压缩级别
[jack@onitroad ~]# time xz -0v linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 112.1 MiB / 553.9 MiB = 0.202 12 MiB/s 0:44 real 0m44.533s user 0m44.084s sys 0m0.420s [jack@onitroad ~]# time xz -9v linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 77.0 MiB / 553.9 MiB = 0.139 1.1 MiB/s 8:20 real 8m20.859s user 8m20.007s sys 0m0.778s
-0 也可以用标志--fast 指定,而选项-9 也可以用标志--best 指定,提供这些是为了与旧工具向后兼容,应该避免。默认情况下,xz 使用 -6 的压缩级别,以牺牲速度为代价略微偏向于更高的压缩。选择1到9之间的值时,重要的是要考虑更重要的是,保存的空间量或者花费压缩的时间量,默认值-6选项提供了公平的折衷。
- 8.极限模式
可以指定 -e 或者 --extreme 标志以在编码时使用更多 CPU 以提高压缩率,但这将花费更多时间。这使用所选压缩级别 (-0 ... -9) 的较慢变体来提高比率,但是这可能会使比率变差,具体取决于数据。
下面我们将比较压缩级别为 0 的 Linux 内核使用极限和不使用极限的区别。
[jack@onitroad ~]# time xz -0v linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 112.1 MiB / 553.9 MiB = 0.202 12 MiB/s 0:44 real 0m44.533s user 0m44.084s sys 0m0.420s [jack@onitroad ~]# time xz -0ve linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 89.9 MiB / 553.9 MiB = 0.162 1.4 MiB/s 6:27 real 6m27.445s user 6m26.298s sys 0m1.136s
如图所示,这个特定示例花费了更长的时间来完成,并且仅压缩了 4%。为了进一步比较,下面我们使用默认 -6 选项压缩了相同的文件。这比使用extreme 的压缩级别0 花费的时间略少,但压缩效果更好。
[jack@onitroad ~]# time xz -6v linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 79.7 MiB / 553.9 MiB = 0.144 1.4 MiB/s 6:23 real 6m23.128s user 6m22.491s sys 0m0.610s
虽然 -e 需要更长的时间才能完成,但如果需要,可以使用它来节省另外的空间。下面是指定extreme的压缩级别6的结果,它需要更长的时间,并且只是稍微提高了压缩率。
[jack@onitroad ~]# time xz -6ve linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 79.2 MiB / 553.9 MiB = 0.143 1.0 MiB/s 8:51 real 8m52.038s user 8m51.373s sys 0m0.627s
- 使用线程提高 xz 性能
默认情况下,xz 作为单线程运行,这意味着如果我们有 4 个 CPU 内核可用,它只会使用 1 个 CPU 内核的资源。通过使用 -T 或者 --threads 标志,我们可以指定要使用的工作线程数,从而可能提高 xz 性能。可以具体设置线程数量,或者可以使用特殊值 0,这将使用与系统上可用的 CPU 内核一样多的线程。
下面的示例将运行 xz 与压缩级别 6 以及设置为默认单线程的极限标志与指定的特殊值 0 进行比较。
- 使用线程提高 xz 性能
[jack@onitroad ~]# time xz -6ve linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 79.2 MiB / 553.9 MiB = 0.143 1.0 MiB/s 8:51 real 8m52.038s user 8m51.373s sys 0m0.627s [jack@onitroad ~]# time xz -6ve --threads=0 linux-3.18.19.tar linux-3.18.19.tar (1/1) 100 % 80.2 MiB / 553.9 MiB = 0.145 4.0 MiB/s 2:16 real 2m16.994s user 8m43.762s sys 0m0.488s
测试服务器有 4 个 CPU 内核,因此与 8 分 51 秒相比,在 2 分 16 秒内完成工作的速度几乎快了 4 倍,尽管在多线程运行时生成的压缩文件稍大,但性能显着提高。线程数量也可以指定为 --threads=4 ,这将具有相同的结果,或者可以将其设置为其他数字以使用特定数量的 CPU 资源。
- 10.压缩目录
在 tar 命令的帮助下,我们可以创建整个目录的 tar 文件,并将结果 xz。我们可以一步执行全部操作,因为 tar 命令允许我们指定要使用的压缩方法。
tar cJvf etc.tar.xz /etc/
本示例创建了整个 /etc/ 目录的压缩 etc.tar.xz 文件。 tar 标志如下,'c' 创建一个新的 tar 存档,'J' 指定我们要使用 xz 压缩,'v' 提供详细信息,'f' 指定要创建的文件。生成的 etc.tar.xz 文件包含 /etc/ 中使用 xz 压缩的所有文件。请注意,小写 j(将使用 bzip2)和大写 J(将使用 xz)之间存在差异。
- 11.完整性测试
-t 或者 --test 标志可用于检查压缩文件的完整性。
在普通文件上,如果文件正常,则不会返回任何结果。我们还可以添加 -v 选项来添加一些详细信息,这将显示检查的百分比。
[jack@onitroad ~]# xz -tv linux-3.18.19.tar.xz linux-3.18.19.tar.xz (1/1) 100 % 79.7 MiB / 553.9 MiB = 0.144 55 MiB/s 0:10
我现在已经用文本编辑器手动修改了这个文件并添加了一个随机值,本质上是引入了损坏,现在它不再有效。
[jack@onitroad ~]# xz -t linux-3.18.19.tar.xz xz: linux-3.18.19.tar.xz: Compressed data is corrupt
压缩的 .xz 文件利用循环冗余校验 (CRC) 来检测错误。可以通过运行带有 -l 和 -v 标志的 xz 来查看 CRC 值,如下所示。
[jack@onitroad ~]# xz -lvv linux-3.18.19.tar.xz linux-3.18.19.tar.xz (1/1) Streams: 1 Blocks: 1 Compressed size: 79.7 MiB (83,592,736 B) Uncompressed size: 553.9 MiB (580,761,600 B) Ratio: 0.144 Check: CRC64 Stream padding: 0 B Streams: Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding 1 1 0 0 83,592,736 580,761,600 0.144 CRC64 0 Blocks: Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check CheckVal Header Flags CompSize MemUsage Filters 1 1 12 0 83,592,696 580,761,600 0.144 CRC64 09c77823ecc52290 12 -- 83,592,675 9 MiB --lzma2=dict=8MiB Memory needed: 9 MiB Sizes in headers: No Minimum XZ Utils version: 5.0.0
默认情况下 xz 使用 CRC64,这可以在使用 -C 或者 --check 标志压缩时更改。
- 连接多个文件
多个文件可以连接成一个 .xz 文件。
- 连接多个文件
xzip -c file1.txt > files.xz xzip -c file2.txt >> files.xz
files.xz 现在包含 file1.txt 和 file2.txt 的内容,如果我们解压缩 files.xz,我们将获得一个名为“files”的文件,其中包含两个 .txt 文件的内容。输出类似于运行“cat file1.txt file2.txt”。相反,如果我们想创建包含多个文件的单个文件,我们可以使用支持 xz 压缩的 tar 命令,如上面示例 10 中所述。
- xz 附带的其他命令
xz 包提供了一些非常有用的命令来处理压缩文件,例如 xzcat、xzgrep 和 xzless/xzmore。
正如我们可能从命令的名称中看出的那样,它们本质上是 cat、grep 和 less/more 命令,但它们直接对压缩数据起作用。这意味着我们可以轻松查看或者搜索压缩文件的内容,而无需在第二步中对其进行解压缩和查看或者搜索。
- xz 附带的其他命令
[jack@onitroad test]# xzcat test.txt.xz test example text [jack@onitroad test]# xzgrep exa test.txt.xz example
这在搜索或者查看在日志轮换期间压缩的日志文件时特别有用。