在一个命令中创建tar.xz


159

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

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

Answers:


241

-J压缩选项用于xz。并记住要man tar:)

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

编辑2015-08-10:

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

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

5
添加v到命令开关(tar -cJvf)会很详细,显示了正在添加到存档中的文件。
Stuart Cardall '16

7
鉴于排序对于破折号很重要,因此最好假设排序始终很重要f,即使没有破折号也要放在最后。
mwfearnley

1
是否可以传递-z(--extended)之类的xz参数?显然,默认情况下不会使用扩展。
chmike

3
tar在macOS上似乎支持,-J但手册页中未提供该功能。不得不在这里查找。尽管他们确实在--options... 的部分中提到了XZ
cbarrick '18

1
@chmike使用XZ_OPT环境变量。例如XZ_OPT =“-9e -T0”。
凌晨

50

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

制作.tar.xz档案

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

说明

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

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

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

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


16
-f传递给时,并不表示“来自文件” xz。而是它的缩写--force(有关详细信息,请参见xz(1)),除非需要,否则最好不要使用。
伊利亚·卡根

@EliahKagan固定。谢谢。
Wojciech Adam Koszek '18

2
要使用多线程压缩,可以使用选项-T0:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc

另一个优点是,您可以在命令行上轻松指定xz的压缩级别或任何其他选项。例如,如果您想加快压缩速度,而不在乎可以使用-1 -T0-0 -T0作为选项使用的大小,通常在可比或更快的时间内,与gzip相比,文件大小仍然较小,而默认设置则要-6慢得多比gzip
fgwaller18年

38

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

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

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

它的工作原理与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


8

使用xz压缩选项

如果要为使用压缩选项xz,或者tar在MacOS上使用压缩选项,则可能要避免使用tar -cJf语法。

根据man xz,执行此操作的方法是:

tar cf - baz | xz -4e > baz.tar.xz

因为我喜欢Wojciech Adam Koszek的格式,但不喜欢以下信息:

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

在哪里-4e,使用您自己的压缩选项。我经常使用-k--keep的原始文件,-9对于较重的压缩。-z手动设置xz为zip,但如果没有其他指示,则默认为zip。

解压和解压

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

xz -dc baz.tar.xz | tar x

注意:与Rafael的答案不同,请使用xz -dc代替catxz。如果您使用此脚本进行脚本编写,则文档会建议这样做。最好养成使用-d--decompress代替的习惯unxz。但是,如果必须的话,可以从命令行使用这些命令。


tar -cJf在MacOS上不使用语法的任何特殊原因?很好奇,因为我刚才正在这样做,而且似乎正在工作。
Lo-Tan

2
@ Lo-Tan如果您有焦油,它可以工作。当我使用它时,我没有正确版本的tar,因此它对我不起作用。我还想使用xz的压缩选项,如果使用tar则无法使用。另外,管道语法对于我来说更容易记住,因此我倾向于使用它。但是对每个人来说都是如此
Connor

4

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

注意:

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

+1在RHEL 5.10上,我看不到任何J选项,但这可行。我认为您需要RHEL6。
Brian

2
为什么不调整命令以将输出从tar传递到xz?
mwfearnley

@mwfearnley我认为注释只是为了强调需要顺序执行的命令。由于两个命令都使用了文件名,因此它们不会从标准输出或输入中写入或读取数据。如果在未指定文件名的情况下使用该命令,则可以将它们链接起来,例如tar -c file-to-compress | xz -z > file.tar.xz
杰克Q

使用&不会一个接一个地启动命令。相反,它将启动第一个作为后台进程。
Luis Lavaire
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.