我有一个像这样的加密文件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
之前会出现输出: 。gpg
Extracting archive: ERROR: Can not open the file as archive
答案1
您还没有标记压缩,但文件名包含.zip
,所以我假设解密后它实际上是一个 zip 文件。
看这个答案:
ZIP 文件格式在档案末尾包含一个目录(索引)。此目录指出档案中每个文件的位置,因此允许快速、随机访问,而无需读取整个档案。
这在尝试通过管道读取 ZIP 档案时似乎会造成问题,因为索引直到最后才会被访问,因此在文件完全读取且不再可用之前,无法正确提取单个成员。因此,当档案通过管道提供时,大多数 ZIP 解压器都会失败,这似乎并不奇怪。
档案末尾的目录并不是档案中存储文件元信息的唯一位置。此外,出于冗余目的,各个条目还将此信息包含在本地文件头中。
虽然并非每个 ZIP 解压器都会在索引不可用时使用本地文件头,但
tar
和cpio
前端libarchive
(又名bsdtar
和bsdcpio
)在通过管道读取时可以并且会这样做,[…]
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 格式真的需要一个可查找的文件。