将 zip 和 unzip 连接在一起以形成恒等函数

将 zip 和 unzip 连接在一起以形成恒等函数

更新:仔细检查手册页后发现,unzip 尚不支持从标准输入读取档案。用户可以参考手册页funzip。我想这让我的问题变得毫无意义,但无论如何我都会留下它。

我正在尝试编写 zip 和 unzip 以创建一个充当标识函数的命令,这意味着它接受 stdin 中的输入并在 stdout 上生成相同的输出。但是,我无法让它工作。我阅读了两个手册页(尤其是 zip 有详细的手册页)并相信这会起作用

echo "hello" | zip | unzip -p | echo

解释:

  • echo 应该产生初始标准输入
  • 根据手册页,没有命令的 zip 在 stdin 上获取输入并在 stdout 上生成输出
  • 使用 -p 解压缩应该在标准输出上产生输出。注意:我相信这里可能缺少一些东西,以表明输入是从标准输入到达的。我尝试添加-但没有成功。手册页似乎没有涵盖这一点。
  • echo 可视化标准输出上出现的内容

请注意:我只是尝试通过此命令提供单个文件,因此我不需要担心目录/多个文件。

答案1

unzip要求存档是可查找的(随机访问),因为zip累积了存档文件的信息,并在末尾写入整个内容列表和统计信息。因此管道永远不会被接受作为 zip 存档。

zip在写入时甚至不知道存档中每个文件的长度,因为它们是动态单独压缩的。

tar相比之下,可以通过管道写入和读取。这样做的开销是(a)必须串行读取文件以定位特定文件(因为元数据分布在存档中),以及(b)整个存档需要作为一个单元进行压缩和解压缩,因此检索一个文件需要解压整个存档。

编辑:tar注释上有轻微的骑手:如果存档是不是压缩,然后tar可以在磁盘上查找文件数据(它知道每个文件的大小,以及块填充规则)。如果磁带机具有“跳过块”功能,则它可以使用该功能。在管道中,它必须读取并丢弃它想要跳过的任何文件。

相关内容