Linux 管道查看器,如何拆分管道?

4
我正在尝试使用pv解压大型.tar文件。
pv large_file.tar.gz | tar -xcf /../MyFolder.

pv命令按预期工作,可以在控制台中显示进度。

我尝试将stdout分割,以便既在控制台中显示进度,又将相同的输出保存到文件中。

我尝试使用tee命令操作,但无法使其工作。

pv large_file.tar.gz | tee /tmp/strout.log | tar -xcf /../MyFolder

有什么建议可以同时将进度显示到控制台并保存到文件中吗?
谢谢!
2个回答

3

我不确定你的原始命令是否有效,因为tar选项中有几个错误。

考虑到../MyFolder已经存在,你的第一个命令应该是:

    pv large_file.tar.gz | tar -xz -C ../MyFolder

如果在pvtar调用之间插入tee调用,则整个链路将正常工作。
    pv large_file.tar.gz | tee /tmp/strout.log | tar -xz -C ../MyFolder

然而,我不确定它是否符合您的预期。如果将 pv 输出管道传输到 tee,则 tee 将其传输到 tar,并且将与原始 tar 相同的内容转储到 /tmp/strout.log,导致您的 tar 文件解压到 ../MyFolder 并复制到 /tmp/strout.log。

编辑
如 @DownloadPizza 所建议的那样,您可以使用进程代替(参见 How do I write stderr to a file while using "tee" with a pipe?)。通过使用 pv 的 -f 标志,您的命令将变为:

    pv -f large_file.tar.gz 2> >(tee /tmp/strout.log) > >(tar -xz -C ../MyFolder)

并将生成预期的输出。


谢谢!最后的组合完美地运作了!非常感激! - slivinn

2
PV进度会发送到stderr,你可以尝试这样做: pv large_file.tar.gz > >(tar -xz -C ./MyFolder/) | echo 你可能需要编辑tar命令,因为我不能让你的命令在我的电脑上工作。

谢谢!你们两个的答案完美地配合在一起了! - slivinn

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