正确使用带命名管道的 gzip

Correct using gzip with named pipes

我正在尝试创建一个命名管道,它可以将目录作为输入并将其放入 tar.gz 存档 我试图做的是这样的:

mkfifo channel
gzip -9 -c < channel > out.tar.gz

但它只接受像

这样的文本数据
cat myfile > channel

有什么方法可以将目录传递到此管道或修改它以便将其作为参数? 谢谢。

解决方案就像

一样简单
tar cf - MyDirectory/ > channel

我用的频道是一样的。

您的回答描述了一个命名管道,它压缩 它获得的任何输入。如果您通过管道输入目录 (a .tar) 的未压缩存档,它会将其压缩为压缩存档 (a .tgz).

此外,任何其他作为输入的字符串都将使用此压缩:

$ echo "hello world" > channel
$ zcat out.tar.gz

这将打印 hello world 并且文件 out.tar.gz 将不是正确的 .tgz (或 .tar.gz 只是更长的形式)。

您最初的问题听起来更像是您想将 目录 作为输入(还不是它的存档)。这可能意味着目录的路径。你可以这样实现:

read dirpath < channel; tar cfz out.tgz "$dirpath"

这将休眠直到可以从管道中读取内容。

在另一个 shell 中,您可以提供要归档的目录:

echo path/to/directory > channel

然后第一个 shell 将开始工作,压缩命名目录并生成 out.tgz 文件。