首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 XZ Utils 获得更高的压缩率-关于 XZ 指令

使用 XZ Utils 获得更高的压缩率-关于 XZ 指令

使用 xz 命令xz 命令的基本用法
  • xz 命令帮助信息                       
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ xz --help
    Usage: xz [OPTION]... [FILE]...
    Compress or decompress FILEs in the .xz format.

    -z, --compress      force compression
    -d, --decompress    force decompression
    -t, --test          test compressed file integrity
    -l, --list          list information about .xz files
    -k, --keep          keep (don't delete) input files
    -f, --force         force overwrite of output file and (de)compress links
    -c, --stdout        write to standard output and don't delete input files
    -0 ... -9           compression preset; default is 6; take compressor *and*
                         decompressor memory usage into account before using 7-9!
    -e, --extreme       try to improve compression ratio by using more CPU time;
                         does not affect decompressor memory requirements
    ...




  • 压缩一个文件 test.txt,压缩成功后生成 test.txt.xz, 原文件会被删除。                       
    1
    2
    3
    $ xz test.txt
    $ ls test.txt*
    test.txt.xz




  • 解压 test.txt.xz 文件,并使用参数 -k 保持原文件不被删除,                       
    1
    2
    3
    $ xz -d -k test.txt.xz
    $ ls test.txt*
    test.txt.xz test.txt




  • 使用参数 -l 显示 .xz 文件的基本信息。基本信息包括压缩率、数据完整性验证方式等。也可以和参数 -v 或 -vv 配合显示更详尽的信息。                       
    1
    2
    3
    $ xz -l index.txt.xz
    Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
       1       1        768 B      1,240 B  0.619  CRC64   index.txt.xz




  • 使用参数 -0, -1, -2, … -6, … -9 或参数 --fast, --best 设定压缩率。xz 命令的默认为 -6 ,对于大多数系统来说,甚至是一些较旧的系统,-4 … -6 压缩率预设值都不错的表现。                       
    1
    2
    $ xz -k7 xz_pipe_decomp_mini.c
    $ xz -k --fast xz_pipe_decomp_mini.c




  • 和 tar 命令配合处理多个文件。一般来说,有两种简单的方法将 tar 和 xz 结合起来,一是使用管道,或是使用 tar 命令的参数'J'。两种方法各自有各自的优点,第一种方法可以充分利用 xz 利用丰富的参数。而第二种方法使用起来更简单容易。例子分别如下
    • 使用管道                       
      1
      2
      $  tar cf -  *.c  | xz --best > src.tar.xz   # compress
      $  xz -d src.tar.xz --stdout | tar -x        # decompress




    • 使用 tar 参数 "J                       
      1
      2
      $  tar cJf src.txz  *.c                      # compress
      $  tar xJf src.txz                           # decompress





      "
复杂的用法
  • 使用参数 -H 显示 xz 命令所有 options. 参数 -H 比使用参数 --help 显示的内容更详细。                       
    1
    $ xz -H  | more




  • 借助 xargs 命令并行压缩多文件。下面的命令行可以将 /var/log 目录下所有的扩展名为 .log 的文件压缩。通过 xargs 命令同时运行多个 xz 进行压缩。                       
    1
    # find /var/log -type f -iname "*.log" -print0 | xargs -P4 -n16 xz -T1




    注意:运行此命令须有 root 权限。
  • 连接 (concatenation) 多个 .xz 文件。可以把多个压缩数据流连接 (concatenation) 到一个文件中。解压缩时,就像解压一个正常单压缩流文件一样。如下例,两个 .xz 文件 concat_1.txt.xz 和 concat_2.txt.xz, 用 cat 命令将他们合并为文件 concat.xz,解压缩 concat.xz 这个文件会发现 concat_1.txt.xz 和 concat_2.txt.xz 中的内容合并在一起了。                       
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ xzcat concat_1.txt.xz
    .xz file concatenation test: ~ file1 ~
    $ xzcat concat_2.txt.xz
    .xz file concatenation test: ~ file2 ~
    $ cat concat_1.txt.xz concat_2.txt.xz > concat.txt.xz  #concatenation
    $ xz -d concat.txt.xz                   #decompress
    $ cat concat.txt                         #print file concat.txt
    .xz file concatenation test: ~ file1 ~
    .xz file concatenation test: ~ file2 ~




  • 适于 shell 编程的 Robot 模式。xz 命令使用参数 --robot 输出易于 shell 处理的信息。                       
    1
    2
    3
    4
    5
    6
    7
    $ xz --list xz_pipe_mini.exe.xz            ## normal output
    Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
       2       2     12.8 KiB     42.7 KiB  0.300  CRC64   xz_pipe_mini.exe.xz
    $ xz --list --robot  xz_pipe_mini.exe.xz   ## robot model
    name    xz_pipe_mini.exe.xz
    file    2       2       13112   43695   0.300   CRC64   0
    totals  2       2       13112   43695   0.300   CRC64   0       1




    下例是利用 --robot 打印出文件压缩率的一个例子:
    1
    2
    3
    4
    $ xz -l --robot xz_pipe_mini.exe.xz | gawk \
           '/^name/ {printf "%s =>",$2} \
            /^totals/ {printf "compressed radio:%.2f%\n", $6 * 100}'
    xz_pipe_mini.exe.xz =>compressed radio:30.00%




  • 自定义 filter Chain. 有时需要一些特殊的设定,以满足一些特定需求。xz 提供了很多 参数自定义压缩细节。下面有两个例子
    • 若希望解压缩使用很少内存,比如在嵌入式系统中解压。可以使用使用参数 -e,并设定压缩使用的字典大小为 64KB。参数 -e (--extreme) 是指使用稍慢的压缩速度以尝试稍稍提高一些压缩率。这样便可在解压缩时使用很少的内存空间。命令如下:                        $ xz --check=crc32 --lzma2=preset=6e,dict=64KiB file
    • 若压缩文件中是可执行的二进制数据时,使用的合适的 BCJ(branch/call/jump) filter 可以提高压缩率。例如 libwx_gtk2u_core-2.8.so.0.8.0 是 wxGTK 库的一个共享库文件,它原始的大小为 3980KB. 若采用默认的参数压缩后的大小为 916KB. 通过相应指定 filter Chain, 可以生成更小些的文件 .                       
      1
      2
      3
      4
      5
      6
      $ xz libwx_gtk2u_core-2.8.so.0.8.0
      $ du -k libwx_gtk2u_core-2.8.so.0.8.0.xz
      916 libwx_gtk2u_core-2.8.so.0.8.0.xz
      $ xz --x86 --lzma2 libwx_gtk2u_core-2.8.so.0.8.0
      $ du -k libwx_gtk2u_core-2.8.so.0.8.0.xz
      856     libwx_gtk2u_core-2.8.so.0.8.0.xz




从上面执行结果来看,利用合适的 filter Chain 最终生成的文件大小为 865KB。参数 --x86 --lzma2 就组成了一个 filter Chain。参数 --x86 是指使用 x86 平台的 BCJ filter,适用于 32 位和 64 位系统。参数 --lzma2 则指使用 lzma2 算法进行压缩。
使用 xzgrep,xzcat,xzdiff 等实用工具xzcatxzcat 命令其相当于 "xz --decompress --stdout" 就是将解压出的数据输出到标准输出 (stdout)。下面的例子用来统计压缩 test.txt.xz 文件所包含数据的行数。
1
$ xzcat test.txt.xz | wc -l  ## count the lines of test.txt




xzgrepxzgrep 可以用来 grep 压缩文件所包含的数据内容。其内部就是调用 grep 命令,所以参数和 grep 一致。下面的例子打印出 xz_pipe_comp_mini.c.xz 中所有包含以"lzma_"开头单词的行号和行内容。例:
1
2
3
4
5
6
7
$ xzgrep -P -n "lzma_\w+" xz_pipe_comp_mini.c.xz
8:    lzma_check check = LZMA_CHECK_CRC64;
9:    lzma_stream strm = LZMA_STREAM_INIT; /* alloc and init lzma_stream struct */
15:    lzma_easy_encoder (&strm, 6, LZMA_CHECK_CRC64);
28:        lzma_action action = in_finished ? LZMA_FINISH : LZMA_RUN;
35:            lzma_code (&strm, action); /* compress data */
42:     lzma_end (&strm);




xzless 和 xzmore这两个命令可以分页查看压缩文件中的内容。简单的来说,相当于
1
"xzcat <file.xz> | less" 或 "xzcat <file.xz> | more"




xzdiff 和 xzcmp这两个命令用于比较两个 .xz 文件。内部分别调用命令 diff 和 cmp 来实现文件内容的比较。例:
1
2
3
4
5
6
7
8
$ xzdiff xz_pipe_comp_mini.c.orig.xz xz_pipe_comp_mini.c.xz
20c20
<         if (feof (in_file))
---
>         if (feof (in_file))  {
21a22
>         }
$

返回列表