解密和解压文件

解密和解压文件

我有一个像这样的加密文件file.zip.gpg

解密是使用gpg --output file.zip --decrypt file.zip.gpg并随后解压档案内容完成的7z(a) x file.zip

第一个命令显然会创建一个(临时)文件。我想知道是否可以将两个命令合并为一个命令(管道?),以防止在磁盘上创建临时文件。

我试过

gpg --decrypt file.zip.gpg | 7z x -si

但在要求输入密码7z之前会出现输出: 。gpgExtracting archive: ERROR: Can not open the file as archive

答案1

您还没有标记,但文件名包含.zip,所以我假设解密后它实际上是一个 zip 文件。

这个答案

ZIP 文件格式在档案末尾包含一个目录(索引)。此目录指出档案中每个文件的位置,因此允许快速、随机访问,而无需读取整个档案。

这在尝试通过管道读取 ZIP 档案时似乎会造成问题,因为索引直到最后才会被访问,因此在文件完全读取且不再可用之前,无法正确提取单个成员。因此,当档案通过管道提供时,大多数 ZIP 解压器都会失败,这似乎并不奇怪。

档案末尾的目录并不是档案中存储文件元信息的唯一位置。此外,出于冗余目的,各个条目还将此信息包含在本地文件头中。

虽然并非每个 ZIP 解压器都会在索引不可用时使用本地文件头,但tarcpio前端libarchive(又名bsdtarbsdcpio)在通过管道读取时可以并且会这样做,[…]

bsdtar在我的 Debian 9 中,使用(来自包)的解决方案libarchive-tools有效:

gpg --decrypt file.zip.gpg | bsdtar -xvf-

其他答案提供了其他解决方案。其中一些确实使用了伪装的临时文件(例如=( … )在 zsh 中),而另一些则没有(例如busybox unzip -,但这个对我来说不起作用)。


如果格式是 7z 而不是 zip,那么问题会类似。比较此主题

尝试通过管道7za

7za我正在尝试在 C++ 程序中的管道中运行。[…]

如果我尝试在命令行上执行此操作,也会发生同样的事情。

7za e -an -si -so < filename.7z >/dev/null
ERROR:
Can not open the file as archive

E_NOTIMPL

Igor Pavlov(7-zip 的创建者)的答案是:

7-zip 需要对 7z 档案执行“搜索”操作。因此您无法使用-si它来提取 7z 档案。

这是 2016-03-30 的测试。我的测试和变更日志表明该声明在 2019 年仍然有效。此外,bsdtar在我的 Debian 中无法帮助,它会产生Error seeking in stdin。我猜 7z 格式真的需要一个可查找的文件。

相关内容