当我尝试解压拆分的 zip 文件时出现错误

当我尝试解压拆分的 zip 文件时出现错误

操作系统版本:

root@triiage_1:~/zip# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"

压缩包版本:

root@triiage_1:~# zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.

Compiled with gcc 6.3.0 20170415 for Unix (Linux ELF).

我有 2 个 cpio 文件

root@triiage_1:~/zip# ll -h;file *
total 111M
drwxr-xr-x  2 root root 4.0K Feb 28 09:12 ./
drwx------ 15 root root  12K Feb 28 09:12 ../
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel1.cpio
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel2.cpio
kernel1.cpio: ASCII cpio archive (SVR4 with no CRC)
kernel2.cpio: ASCII cpio archive (SVR4 with no CRC)

我用 zip 压缩它们并分割 zip 文件,每个分割文件 15MB。

root@triiage_1:~/zip# zip xk.zip -s 15m kernel1.cpio kernel2.cpio
  adding: kernel1.cpio (deflated 1%)
  adding: kernel2.cpio (deflated 1%)
root@triiage_1:~/zip# ll -h
total 220M
drwxr-xr-x  2 root root 4.0K Feb 28 09:23 ./
drwx------ 15 root root  12K Feb 28 09:12 ../
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel1.cpio
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel2.cpio
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip
root@triiage_1:~/zip# file *
kernel1.cpio: ASCII cpio archive (SVR4 with no CRC)
kernel2.cpio: ASCII cpio archive (SVR4 with no CRC)
xk.z01:       Zip multi-volume archive data, at least PKZIP v2.50 to extract
xk.z02:       data
xk.z03:       data
xk.z04:       data
xk.z05:       data
xk.z06:       data
xk.z07:       data
xk.zip:       data

删除原有的 kernel1.cpio kernel2.cpio

root@triiage_1:~/zip# rm kernel1.cpio kernel2.cpio
root@triiage_1:~/zip# ll -h
total 110M
drwxr-xr-x  2 root root 4.0K Feb 28 09:23 ./
drwx------ 15 root root  12K Feb 28 09:12 ../
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip

使用“7z e xk.zip”解压xk.zip,成功。

root@triiage_1:~/zip# 7z e xk.zip

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz (406E3),ASM,AES-NI)

Scanning the drive for archives:
1 file, 4718352 bytes (4608 KiB)

Extracting archive: xk.zip
--
Path = xk.zip
Type = zip
Physical Size = 4718352
Embedded Stub Size = 4
Total Physical Size = 114818832
Multivolume = +
Volume Index = 7
Volumes = 8

Everything is Ok

Files: 2
Size:       115745324
Compressed: 114818832
root@triiage_1:~/zip# ll -h
total 220M
drwxr-xr-x  2 root root 4.0K Feb 28 09:24 ./
drwx------ 15 root root  12K Feb 28 09:12 ../
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel1.cpio
-rw-r--r--  1 root root  56M Feb 28 09:09 kernel2.cpio
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip

再次删除 kernel1.cpio kernel2.cpio。

root@triiage_1:~/zip# ll -h
total 110M
drwxr-xr-x  2 root root 4.0K Feb 28 09:37 ./
drwx------ 15 root root  12K Feb 28 09:28 ../
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip

尝试将分割后的 zip 文件 xk.zip xk.z01~z07 合并为一个 yk.zip,然后解压,出现错误。

root@triiage_1:~/zip# zip -s0 xk.zip -O yk.zip
 copying: kernel1.cpio
 copying: kernel2.cpio
root@triiage_1:~/zip# ll -h
total 160M
drwxr-xr-x  2 root root 4.0K Feb 28 09:47 ./
drwx------ 15 root root  12K Feb 28 09:28 ../
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip
-rw-r--r--  1 root root  51M Feb 28 09:47 yk.zip
root@triiage_1:~/zip# unzip yk.zip
Archive:  yk.zip
  inflating: kernel1.cpio
  error:  invalid compressed data to inflate
  inflating: kernel2.cpio
  error:  invalid compressed data to inflate
root@triiage_1:~/zip# ll -h
total 211M
drwxr-xr-x  2 root root 4.0K Feb 28 09:47 ./
drwx------ 15 root root  12K Feb 28 09:28 ../
-rw-r--r--  1 root root  31M Feb 28 09:09 kernel1.cpio
-rw-r--r--  1 root root  21M Feb 28 09:09 kernel2.cpio
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z01
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z02
-rw-r--r--  1 root root  15M Feb 28 09:22 xk.z03
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z04
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z05
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z06
-rw-r--r--  1 root root  15M Feb 28 09:23 xk.z07
-rw-r--r--  1 root root 4.5M Feb 28 09:23 xk.zip
-rw-r--r--  1 root root  51M Feb 28 09:47 yk.zip

这是我的担心。

a. kernel1.cpio的大小从56M改为31M,好像有些东西丢失了。

b. kernel2.cpio的大小由56M改为21M,好像有些丢失。

c. 拆分后的 zip 文件 xk.zip xk.z01~z07 总大小约为 110M,为何合并后的 zip 文件 yk.zip 只有 51MB?

我错了吗?

答案1

根据个人经验,7z 在某些情况下无法处理多部分 zip 存档。

unzip 不支持多部分档案。zip 3.0 可以合并多部分档案。

因此,首先使用 zip 3.0 从多部分档案中创建单文件档案,如下所示:

$ zip -s- xk.zip -O xk_full.zip

-在命令行选项后使用一个-s没有空格的符号将所有多部分档案合并在一起,并将其写为一个 zip 文件,其文件名由选项指定-O

-s选项是分成几个文件,但如果提供的大小为0或负数(在我们的例子中-),那么就不会进行拆分,而是合并多部分档案。

然后,使用 unzip 解压我们刚刚创建的单文件档案。

$ unzip xk_full.zip

仅供参考,从解压手册

目前尚不支持多部分存档,除非与 zip 结合使用。(必须按顺序将所有部分连接在一起,然后对连接的存档执行 zip -F(对于 zip 2.x)或 zip -FF(对于 zip 3.x)以“修复”它。此外,zip 3.0 及更高版本可以使用 zip -s- inarchive -O outarchive 将多部分(拆分)存档合并为一个组合的单文件存档。有关更多信息,请参阅 zip 3 手册页。)

相关内容