我正在寻找解决将一系列非常大的流连接到stdout,然后再次从stdin读取这些流,将流分成原始部分的问题。我面临的限制是我无法在磁盘上创建任何临时文件。
我尝试使用unxz --singe-stream选项,但这没有我期望的效果。
为了演示我想要实现的目标,我有两个脚本:
user@localhost:~# cat test-source.sh
#!/bin/bash
echo "one" | xz
echo "two" | xz
echo "three" | xz
然后将上面的第一个脚本传送到第二个脚本,该脚本旨在反转效果:
user@localhost:~# cat test-sink.sh
#!/bin/bash
unxz --single-stream
unxz --single-stream
unxz --single-stream
上述脚本应输出以下内容:
one
two
three
相反,我看到以下内容:
user@localhost:~# ./test-source.sh | ./test-sink.sh
one
unxz: (stdin): File format not recognized
unxz: (stdin): File format not recognized
上面的xz只是我试过的一个选项,我对其他建议持开放态度。 gzip想要立即解压缩整个流,我需要保留流之间的界限。
我理解tar不好,因为它无法接受来自stdin的tar流。
还有其他工具可用于编写脚本吗?
答案 0 :(得分:2)
我不知道这是否能解决你的问题(因为它需要安装一些软件,考虑到这个问题的性质可能不是一个选项),但是你有所启发正是你所描述的:
您可以迭代生成来自多个块的输出流,如:
echo "one" | xz | mux
echo "two" | xz | mux
echo "three" | xz | mux
然后将其传递给另一侧的demux
命令以提取单个组件。例如,一个简单的例子:
$ (
echo "one" | xz | mux
echo "two" | xz | mux
echo "three" | xz | mux
) | demux -v
INFO:demux:processing stream 0 to stream-0.out
INFO:demux:processing stream 1 to stream-1.out
INFO:demux:processing stream 2 to stream-2.out
这将获取输入流并在当前目录中生成三个文件。
它还可以执行其他操作,例如可选地添加sha256哈希 到每个流进行数据完整性验证。
答案 1 :(得分:1)
作为替代工具,我提出了tarmux,它提供了一个用C语言编写的多路复用器/解复用器,它基于libarchive提供的tar文件格式。
现在,测试脚本如下所示:
'this is <div>#an</div> message'
而且:
Little-Net:trunk minfrin$ cat ./test-source.sh
#!/bin/bash
echo "one" | tarmux
echo "two" | tarmux
echo "three" | tarmux
tardemux的输出可以通过管道传输到其他命令中,文件也不会碰到磁盘。
答案 2 :(得分:0)
鉴于您的源脚本脚本,如果我运行:
sh test-source.sh | unxz
我得到了输出:
one
two
three
这似乎是你要求的行为。您多次运行unxz --single-stream
的尝试不起作用,因为第一个unxz
进程会消耗所有输入,即使它只提取第一个流。