我有一个大型受密码保护的 7z 存档,其中包含另一个受密码保护的 7z 存档,结构如下:
OuterArchive.7z (200GB)
└── InnerArchive.7z (200GB)
├── SomeFile.ext (1GB)
└── ...
存档的大小非常大(超过 200GB),我没有足够的可用空间来将整个存档提取为文件。因此,我尝试使用标准 I/O 管道通过以下命令仅提取请求的文件:
7z x OuterArchive.7z -so InnerArchive.7z -ppass1 | 7z x -si -so -ppass2 SomeFile.ext
这个命令是否正确(因为它不起作用),并且由于文件大小超过了设备的 RAM(16GB),是否有可能执行这样的事情?
更新: 这是命令的结果:
ERROR:
Can not open the file as archive
E_NOTIMPL
您可以看到命令的第一部分正在运行:
┌──(user㉿dhcppc4)-[~/Desktop/x]
└─$ 7z x OuterArchive.7z -so InnerArchive.7z -ppass1 | head -n 1 | hexdump -C
00000000 37 7a bc af 27 1c 00 04 5f 0f 51 b0 a3 61 2f 29 |7z..'..._.Q..a/)|
00000010 1d 00 00 00 27 00 00 00 00 00 00 00 6f a6 f5 15 |....'.......o...|
00000020 a3 8c 32 aa 06 f8 aa c7 92 b0 42 a1 01 0c 66 a3 |..2.......B...f.|
00000030 77 09 6c c3 f9 da 72 28 20 d0 b6 ac 0b b8 ed fc |w.l...r( .......|
...
所以这部分肯定有问题:
7z x -si -so -ppass2 SomeFile.ext
你可以尝试这个方法。
创建一个虚拟文件。
fallocate -l 1G 内部BigFile1
使用 7z 压缩
7z 一个innerBigFile1.7z innerBigFile1
将someText.txt添加到innerBigFile1.7z
7z 一个innerBigFile1.7z someText.txt
将innerBigFile1.7z添加到outerBigFile.7z
7z 外部BigFile.7z 内部BigFile1.7z
查看 7z 存档内部
7z l 外部BigFile.7z
由于空间限制,从 outrBigFile.7z 中提取 someText.txt,无需创建临时文件。
7z x -so 外层大文件.7z 内层大文件1.7z | 7z x -si -so -y -ttar someText.txt > someTextNew.txt
x:从存档中提取
-so :提取到标准输出
si :从标准输入输入(第一个命令的输出)
-y:说是!
-ttar : 强制输出到 TAR