一条命令创建一个tar.xz压缩包

221

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

我已经尝试过tar cf - file | xz file.tar.xz,但那样行不通。

7个回答

357

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

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

编辑于2015年08月10日:

如果你使用破折号(例如:tar -cf)来传递参数给tar,则必须将-f选项放在最后,因为它指定了文件名(感谢@A-B-B指出这一点!)。在这种情况下,命令看起来像:

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

9
在命令开关中添加 v(如 tar -cJvf)可以显示添加到归档文件中的文件,以便进行详细说明。 - Stuart Cardall
20
考虑到短横线的顺序很重要,最好假定顺序总是重要的,即使没有短横线,也将f放在最后。 - mwfearnley
3
能否传递像 -e(--extended)这样的xz参数?显然,默认情况下它不会使用扩展。 - chmike
4
在 macOS 上,tar 命令似乎支持 -J 参数,但这一特性在手册页面上没有说明。我不得不在这里查找相关信息。尽管在 --options 部分中提到了 XZ,但未对 -J 参数作出解释。 - cbarrick
6
请使用 XZ_OPT 环境变量。例如,XZ_OPT="-9e -T0"。 - Dzenly
显示剩余3条评论

78

Switch -J 只在较新的系统上有效。通用命令是:

制作 .tar.xz 压缩包的命令如下:

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

说明

  1. tar cf - 目录 读取目录并将其放入TAR格式中。此操作的输出生成在标准输出上。

  2. | 将标准输出导入到另一个程序的输入中...

  3. ...这个程序恰好是 xz -z -。 XZ 配置为从标准输入(-) 压缩 (-z) 归档文件。

  4. 您将来自 xz 的输出重定向到 tar.xz 文件。


17
当传递给 xz 命令时,-f 并不意味着“从文件中获取”。相反,它是 --force 的缩写(详见xz(1)),除非必要,最好不要使用。 - Eliah Kagan
@EliahKagan 已修复。谢谢。 - Wojciech Adam Koszek
6
为了使用多线程压缩,可以使用选项-T0: tar cf - directory/ | xz -z -T0 - > directory.tar.xz - oidualc
2
另一个优点是您可以轻松地在命令行上指定xz的压缩级别或任何其他选项。例如,如果您想加快压缩速度并且不太关心文件大小,可以使用-1 -T0-0 -T0作为选项,这通常仍会比gzip更快地提供可比较或更小的文件,而默认的-6比gzip慢得多。 - fgwaller

45

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

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命令。

15

快速解决方案

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 > filename.tar.xz

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

  1. c 创建一个新的归档文件。
  2. f 从目录中读取(最好放在第二个位置,因为 -cf != -fc
  3. - 输出到标准输出
  4. | 将输出管道传递给下一个命令
  5. xz -4e 使用 -4e 压缩选项调用 xz。(等同于 -4 --extreme
  6. > filename.tar.xz 将打包和压缩后的文件传递给 filename.tar.xz

-4e处,使用您自己的压缩选项。 我经常使用 -k 保留原始文件和 -9 进行真正的高度压缩。-z手动设置为 zip ,尽管如果没有另外指定,它默认为 zip。

解压缩并解开tar

Rafael van Horn所述,要解压缩并解开 tar (请参见下面的说明):

xz -dc filename.tar.xz | tar x

注意:与Rafael的答案不同,使用xz -dc而不是catxz。文档建议在您将其用于脚本时使用此选项。最好养成使用-d--decompress而不是unxz的习惯。但是,如果必须使用,直接从命令行中使用这些命令也是可以的。


不使用在MacOS上使用tar -cJf语法的特别原因吗?只是好奇,因为我刚才正在使用它,似乎可以工作。 - Lo-Tan
2
@Lo-Tan 如果你有tar,它就能工作。当我使用它时,我没有正确版本的tar,所以它对我不起作用。我还想使用xz的压缩选项,如果你使用tar就无法这样做。此外,管道语法更容易记忆,所以我倾向于使用它。但是每个人都有自己的选择。 - Connor

10

我总是记不住每个归档选项的用途,所以现在我更喜欢较新版本tar的"自动压缩"功能 (-a--auto-compress)。命令看起来像这样:

tar caf file.tar.xz file

有了“-a”选项,tar命令可以自动从归档文件的扩展名推断出要使用的压缩方式!


2

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

注意:

  1. tar.gz 和 tar.xz 不同,xz 压缩效果更好。
  2. 不要使用管道符号 | ,因为它会同时运行两个命令。使用分号 ; 或者 & 符号可以让命令一个接一个地执行。

在RHEL 5.10上,我没有看到J选项,但这个方法有效。我认为你需要RHEL6。 - Engineer2021
2
为什么不调整命令将tar的输出导入到xz中? - mwfearnley
@mwfearnley 我认为这个注释只是强调需要按顺序执行所需的命令。由于文件名在两个命令中都被使用,它们不会从标准输出或输入中写入或读取数据。如果在不指定文件名的情况下使用该命令,则可以将它们链接起来,例如 tar -c file-to-compress | xz -z > file.tar.xz - Jack Q
1
使用 & 不会一个接一个地启动命令。相反,它将把第一个作为后台进程启动。 - Luis Lavaire.
1
你可能指的是 &&,它按顺序运行命令。如果任何一个单独的命令返回错误代码,它也会停止执行。 - Phillip Schmidt

2
tar -I 'xz -9 -T0' -cf <archive.tar.xz> <files>

在这种方法中,您也可以将参数传递给xz。您可以根据需要更改参数。-9表示压缩级别,-T0表示使用多个线程。
此外,它还可以与其他压缩工具一起使用,例如zstd
tar -I 'zstd -18 -T0' -cf <archive.tar.ztd> <files>

这个命令只适用于 gnu-tar。它随着大多数 Linux 发行版一起提供。在 Mac 上,您可以安装 gtar https://formulae.brew.sh/formula/gnu-tar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接