【问题标题】:Create a tar.xz in one command在一个命令中创建 tar.xz
【发布时间】:2013-09-22 05:54:03
【问题描述】:

我正在尝试在一个命令中创建一个.tar.xz 压缩存档。它的具体语法是什么?

我尝试过tar cf - file | xz file.tar.xz,但不起作用。

【问题讨论】:

    标签: compression archive tar xz


    【解决方案1】:

    xz 使用-J 压缩选项。并记得man tar :)

    tar cfJ <archive.tar.xz> <files>
    

    编辑 2015-08-10:

    如果您将参数传递给tar 使用破折号(例如:tar -cf 而不是tar cf),那么-f 选项必须排在最后,因为它指定了文件名(感谢@A-B-B 指出这一点!)。在这种情况下,命令如下所示:

    tar -cJf <archive.tar.xz> <files>
    

    【讨论】:

    • v 添加到命令开关 (tar -cJvf) 以使其详细显示正在添加到存档的文件。
    • 考虑到顺序对于破折号很重要,最好假设顺序总是很重要,然后将f放在最后,即使没有破折号。
    • 是否可以传递 xz 参数,如 -e (--extended) ?显然它默认不会使用扩展。
    • tar 在 macOS 上似乎支持 -J 但手册页中没有给出该功能。不得不在这里查一下。尽管他们在--options 的部分中确实提到了 XZ...
    • @chmike 使用 XZ_OPT 环境变量。例如。 XZ_OPT="-9e -T0".
    【解决方案2】:

    试试这个:tar -cf file.tar file-to-compress ; xz -z file.tar

    注意:

    1. tar.gz 和 tar.xz 不一样; xz 提供更好的压缩。
    2. 不要使用管道|,因为它会同时运行命令。使用;&amp; 会一个接一个地执行命令。

    【讨论】:

    • +1 在 RHEL 5.10 上,我看不到 J 选项,但这有效。我认为您需要 RHEL6。
    • 为什么不调整命令将输出从 tar 传送到 xz?
    • @mwfearnley 我认为该注释只是为了强调命令需要按顺序执行。由于两个命令中都使用了文件名,因此它们不会从标准输出或输入中写入或读取数据。如果在不指定文件名的情况下使用命令,则可以将它们链接起来,例如tar -c file-to-compress | xz -z &gt; file.tar.xz
    • 使用&amp; 不会一个接一个地启动命令。相反,它将作为后台进程启动第一个进程。
    • 您可能是指&amp;&amp;,它按顺序运行命令。如果任何单个命令返回错误代码,它也会停止执行
    【解决方案3】:

    Switch -J 仅适用于较新的系统。通用命令是:

    制作 .tar.xz 存档

    tar cf - directory/ | xz -z - > directory.tar.xz
    

    说明

    1. tar cf - directory 读取 directory/ 并开始将其转换为 TAR 格式。此操作的输出在标准输出上生成。

    2. | 管道标准输出到另一个程序的输入...

    3. ...恰好是xz -z -。 XZ 配置为从标准输入 (-) 压缩 (-z) 存档。

    4. 您将输出从xz 重定向到tar.xz 文件。

    【讨论】:

    • -f 在传递给xz 时并不表示“来自文件”。相反,它是--force 的缩写(详见xz(1)),除非需要,否则最好不要使用。
    • @EliahKagan 已修复。谢谢。
    • 要使用多线程压缩,可以使用 -T0 选项:tar cf - directory/ | xz -z -T0 - &gt; directory.tar.xz
    • 另一个优点是您可以在命令行上轻松地为 xz 指定压缩级别或任何其他选项。例如,如果您想加快压缩速度并且不太在意大小,您可以使用 -1 -T0-0 -T0 作为选项,这通常仍会在相当或更快的时间内为您提供比 gzip 更小的文件,而默认的-6 比 gzip 慢很多。
    【解决方案4】:

    如果你喜欢管道模式,这是最干净的解决方案:

    tar c some-dir | xz > some-dir.tar.xz
    

    不必为了处理文件而设置f 选项,然后使用- 来指定文件是标准输入。也不必为xz 指定-z 选项,因为它是默认设置。

    它也适用于 gzipbzip2

    tar c some-dir | gzip > some-dir.tar.gz
    

    tar c some-dir | bzip2 > some-dir.tar.bz2
    

    解压也很简单:

    xzcat tarball.tar.xz | tar x
    bzcat tarball.tar.bz2 | tar x
    zcat tarball.tar.gz | tar x
    

    如果你只有tar存档,你可以使用cat

    cat archive.tar | tar x
    

    如果您只需要列出文件,请使用tar t

    【讨论】:

      【解决方案5】:

      快速解决方案

      tarxz() { tar cf - "$1" | xz -4e > "$1".tar.xz ; }
      tarxz name_of_directory
      

      (注意,不是name_of_directory/


      使用 xz 压缩选项

      如果您想对 xz 使用压缩选项,或者如果您在 MacOS 上使用 tar,您可能希望避免使用 tar -cJf 语法。

      根据man xz,这样做的方法是:

      tar cf - filename | xz -4e &gt; filename.tar.xz

      因为我喜欢Wojciech Adam Koszek's format,而不喜欢信息:

      1. c 为指定文件创建一个新存档。
      2. f 从目录读取(最好放在第二个,因为-cf != -fc
      3. - 输出到标准输出
      4. | 管道输出到下一个命令
      5. xz -4e 使用 -4e 压缩选项调用 xz。 (等于-4--extreme
      6. &gt; filename.tar.xz 将 tar 和压缩文件定向到 filename.tar.xz

      -4e 在哪里,请使用您自己的压缩选项。 我经常使用-k--keep 原始文件和-9 进行非常重的压缩。 -z 手动将 xz 设置为压缩,但如果没有其他指示,它默认为压缩。

      解压和解压

      回显Rafael van Horn,解压缩和解压缩(见下面的注释):

      xz -dc filename.tar.xz | tar x
      

      注意:与Rafael's answer 不同,使用xz -dc 而不是catxz。如果您将其用于脚本编写,文档建议这样做。最好养成使用-d--decompress 而不是unxz 的习惯。但是,如果必须,可以从命令行使用这些命令。

      【讨论】:

      • 在 MacOS 上不使用 tar -cJf 语法的任何特殊原因?只是好奇,因为我刚才正在这样做,而且似乎奏效了。
      • @Lo-Tan 如果你有焦油,它可以工作。当我使用它时,我没有正确版本的 tar 所以它对我不起作用。我还想使用 xz 的压缩选项,如果使用 tar,则无法做到这一点。此外,管道语法对我来说更容易记住,所以我倾向于使用它。但各有各的
      【解决方案6】:

      我不记得哪个存档开关做了什么,所以这些天,我更喜欢较新的 tar 版本(-a--auto-compress)中的“自动压缩”功能。然后命令看起来像这样:

      tar caf file.tar.xz file
      

      使用 -a 选项,tar 会从用于存档的文件结尾推断自动使用的压缩!

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 1970-01-01
        • 2020-05-09
        • 2012-01-30
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        相关资源
        最近更新 更多