当前位置: 首页 > 知识库问答 >
问题:

tar | xz时如何重定向xz的正常stdout?

阙博容
2023-03-14

我需要使用像xz这样的压缩器来压缩庞大的tar存档。

我完全了解以前的问题,例如在一个命令中创建tar.xz和利用多核进行tar gzip/bzip压缩/解压缩

从他们那里,我发现这个命令行大部分有效:

tar -cvf - paths_to_archive | xz -1 -T0 -v > OUTPUT_FILE.tar.xz

我使用管道解决方案,因为我必须能够将选项传递给xz。特别是,xz非常占用CPU,所以我必须使用-T0来使用所有可用的内核。这就是为什么我不使用其他选项,比如tar的--使用压缩程序或-J选项。

不幸的是,我真的很想将tar和xz的所有日志输出(即非存档输出)捕获到日志文件中。在上面的示例中,log outout总是由那些-v选项生成。

有了上面的命令行,日志输出现在就打印在我的终端上了。

因此,问题是,当您使用管道连接tar和xz时,不能在命令行结尾使用类似

>Log_File  2>&1

因为更早

> OUTPUT_FILE.tar.xz

解决方案吗?

我试着用这样的子壳包起来

(tar -cvf - paths_to_archive | xz -1 -T0 -v > OUTPUT_FILE.tar.xz) >Log_File  2>&1

但这并不奏效。

共有2个答案

赏弘
2023-03-14

第一个 -cvf - 可以用 cv 代替。

但是,tar cvf-的正常stdout输出是tar文件,该文件通过管道传输到xz中。不确定我是否完全理解,可能是这样的:

tar cv paths | xz -1 -T0 > OUTPUT.tar.xz 2> LOG.stderr

tar cv paths 2> LOG.stderr | xz -1 -T0 > OUTPUT.tar.xz

tar cv paths 2> LOG.tar.stderr | xz -1 -T0 > OUTPUT.tar.xz 2> LOG.xz.stderr

不确定 -T0 是否已实现,您使用哪个版本的 xz?(也许 https://github.com/vasi/pixz 值得仔细研究)在某些系统上安装了sudo apt-get install pv的pv程序比xz -v更擅长显示管道的进度。它会告诉您带有预计到达时间的百分比进度:

size=$(du -bc path1 path2 | tail -1 | awk '{print$1}')
tar c paths 2> LOG.stderr | pv -s$size | xz -1 -T0 > OUTPUT.tar.xz
呼延衡
2023-03-14

tar 的正常标准输出是压缩包,xz 的正常标准输出是压缩文件。这些内容都不是您应该想要捕获的日志。除输出文件本身之外的所有日志记录都专门写入两个进程的 stderr。

因此,您只需要重定向stderr,并且不得重定向stdout,除非您希望输出文件与日志记录混淆。

{ tar -cvf - paths_to_archive | xz -1 -T0 -v > OUTPUT_FILE.tar.xz; } 2>Log_File

顺便说一下,如果您想知道为什么xz-v在输出到TTY时打印更多内容,答案就在message. c的这一行中:progress_automatic标志(告诉xz设置一个计时器来触发SIGALRM-它将其视为应该打印状态的指示-每秒)仅在isatty(STDERR_FILENO)为真时设置。因此,在stderr被重定向到文件后,xz根本不再打印此输出;问题不在于它没有被正确重定向,而是它不再存在。

但是,如果您真的愿意,您可以每秒从自己的代码向< code>xz发送< code>SIGALRM:

{
  xz -1 -T0 -v > OUTPUT_FILE.tar.xz < <(tar -cvf - paths_to_archive) & xz_pid=$!
  while sleep 1; do
    kill -ALRM "$xz_pid" || break
  done
  wait "$xz_pid"
} 2>Log_File

(避免将 xz 执行所需的时间四舍五入到最接近秒的代码是可能的,但留给读者作为练习)。

 类似资料:
  • XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩速度也很快。最初 XZ Utils 的是基于 LZMA-SDK 开发,但是 LZMA-SDK 包含了一些 WINDOWS 平台的特性,所以 XZ Utils 为以适应 POSIX 平台作了大幅的修改。XZ U

  • XZ Utils 是一个数据压缩软件,支持跨平台,可用来处理 .xz 扩展名的压缩档。

  • tar 打包压缩命令 tar -cf php.tar php-7.2.6 #打包目录不压缩 tar -xf php.tar #解压目录 tar -czvf filename.tar.gz test #打包 test 目录并使用 gzip 压缩并显示文件信息 tar -xzvf filename.tar.gz #解压 gzip 文件并输出文件信息 tar -cjvf filename.tar

  • 问题内容: 如何在go程序中读取xz文件?当我尝试使用阅读它们时,出现错误。 问题答案: 您有3个选择。 尝试另一个库,也许是使用cgo的库。我在这里看到两个。 直接使用cgo /创建自己的lib。 使用xz可执行文件。 选项三比听起来容易。这是我会用的: 此处可运行的代码:http : //play.golang.org/p/SrgZiKdv9a

  • 我正在使用Asgard CMS,这是一个基于Laravel 5.1构建的模块化CMS,并且在我创建的特定模块中面临上述问题。 整个站点都有很多post请求和重定向,这很好,但是当涉及到配置文件模块时,我遇到了这个问题。 我将一个编辑请求发布到一个路由,在完成一些工作后,我重定向回路由。当我重定向时,它会显示一个空白页面,上面写着“重定向到”http://www...“首先写入,然后在2-3秒后重定

  • 问题内容: 我正在nodejs / expressjs中构建购物车应用程序。在用户登录后重定向到正确的页面时,我遇到了一些问题。我发现有几篇文章密切相关,但是我从给定的文章中进行修复的所有尝试都没有成功。 发生的情况是,用户输入其登录信息,然后单击登录按钮。Ajax请求将数据发送到此访问功能。该功能首先检查用户是否存在于数据库中。如果是,那么它将继续比较bcrypt密码,如果它们相等,则它们成功登

  • 我正在尝试使用google api for php登录,然后将用户重定向到dashboard.php,但是在重定向我的文件时突然出现了这个错误:这个回调文件负责标记并重定向到dashboard.php 包含设置的gog.php(我删除了这些值) 索引php,它检验用户是否使用google帐户或电子邮件pwd登录 包含的config.php文件具有要连接的数据库设置 最后是dashbaord.php

  • 我使用Java编写了soap客户端服务 我还使用了Spring WS 当我通过SoapUI发送请求时,我会得到响应 当我使用客户机代码发送请求时,我得到一个错误 客户配置 你能帮助我吗?我真的不知道怎么修。谢谢