多卷文件不能只看扩展名决定“合并”。.001 既可能是原始字节切片,也可能是 7z 的第一卷,或是某个工具的私有命名。先按发布说明和完整文件名识别格式;不确定时,先列出内容或向发布者确认,不要直接拼接。

先识别格式

文件名示例 常见含义 正确起点
backup.001、backup.002 原始字节切片,原文件被按字节顺序拆开 确认发布者明确说明是原始切片后再拼接
backup.7z.001、backup.7z.002 7-Zip 分卷 直接对第一卷 backup.7z.001 列出、测试或解压
backup.z01、backup.z02、backup.zip 标准分卷 ZIP 所有卷放在同一目录,直接操作最后的 .zip
backup.part1.rar、backup.part2.rar,或 backup.rar、backup.r00 RAR 分卷 所有卷放在同一目录,直接操作第一卷 .part1.rar 或 .rar
只有 backup.001,来源或生成工具不明 未知 不解压、不拼接;核对发布说明、校验清单和原始工具

编号必须连续、卷名必须属于同一组,并且所有卷都要保留在同一目录。缺一卷、混入同名旧文件或磁盘空间不足都会导致失败。预留空间至少要覆盖分卷总大小、解压后的内容和额外的临时空间。

解压前的安全检查

压缩包内容不等于可信内容。发布者给出的 SHA-256 只能在校验值本身来自可信、经过认证的渠道时,证明你拿到的字节与其一致;它不能单独证明发布者可信,也不能替代恶意文件扫描。

  1. 记录发布页上的文件名、算法和校验值,避免从评论区或不明转贴复制哈希。
  2. 对完整归档或每个发布者指定的文件计算哈希;不要拿“分卷大小差不多”代替哈希。
  3. 先用 7z l 查看文件名、总大小和异常的大文件,再用 7z t 测试完整性。
  4. 解压到新建、专用的输出目录,不要覆盖工作目录中的现有文件。
  5. 不信任来源的归档应在受限环境中处理,并留意压缩炸弹、极大展开体积、意外的可执行文件和可疑路径。列表正常或测试通过不代表内容安全。

7-Zip 的 l 用于列出内容,t 用于测试归档完整性,x 会保留目录结构;-o 可指定输出目录。

7z、ZIP 与 RAR:直接从正确的卷开始

以下示例假定所有分卷已经下载到当前目录。不要先把 .7z.001、.z01 或 RAR 分卷拼成一个新文件。

Windows

先列出并测试。若 7z 不在 PATH,请在 7-Zip 安装目录运行,或使用其完整路径。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# .7z.001:从第一卷开始
7z l .\backup.7z.001
7z t .\backup.7z.001

# 分卷 ZIP:从最后的 .zip 开始
7z l .\backup.zip
7z t .\backup.zip

# RAR:从第一卷开始
7z l .\backup.part1.rar
7z t .\backup.part1.rar

测试成功后,为每个归档创建一个空输出目录,再解压。这里没有使用自动覆盖选项;如果目标目录出现同名文件,应停止并检查原因。

1
2
New-Item -ItemType Directory -Path .\extract-backup -ErrorAction Stop
7z x .\backup.7z.001 -o".\extract-backup"

对 ZIP 或 RAR,只需把归档参数替换为 backup.zip 或 backup.part1.rar。在 PowerShell 中计算发布者提供的 SHA-256:

1
Get-FileHash .\backup.7z.001 -Algorithm SHA256

Linux / WSL

先安装发行版提供的当前 7-Zip 软件包,再以相同方式操作。软件包名称随发行版变化,安装前请检查本机的软件包信息。

1
2
3
4
5
6
7
# .7z.001
7z l ./backup.7z.001
7z t ./backup.7z.001

# 分卷 ZIP 或 RAR
7z l ./backup.zip
7z t ./backup.part1.rar

使用一个之前不存在的目录作为目的地:

1
2
3
mkdir ./extract-backup
7z x ./backup.7z.001 -o./extract-backup
sha256sum ./backup.7z.001

若发布者为 ZIP 或 RAR 提供了完整归档的哈希,按其说明计算相应文件的哈希。若提供的是每卷哈希,则每一卷都必须匹配。

仅适用于原始字节切片的拼接

只有发布者明确说明这些文件是“原始切片”或“二进制分割”,才使用本节。先检查编号连续,例如 movie.001、movie.002、movie.003;.001、.002、.010 这种固定宽度编号可以按字典序排列,非固定宽度编号必须逐个确认顺序。

拼接前应计算精确字节数,不要使用会按块取整的 du。合并后文件的字节数应等于所有输入切片字节数之和;这只能发现长度问题,仍应以发布者的哈希为准。

Windows:PowerShell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$parts = @('.\movie.001', '.\movie.002', '.\movie.003')
$expectedBytes = ($parts | Get-Item | Measure-Object -Property Length -Sum).Sum

# -LiteralPath 明确指定已核对过顺序的切片,不用通配符猜测顺序。
$destination = '.\movie.iso'
$out = [System.IO.File]::Open($destination, [System.IO.FileMode]::CreateNew)
try {
  foreach ($part in $parts) {
    $in = [System.IO.File]::OpenRead($part)
    try { $in.CopyTo($out) } finally { $in.Dispose() }
  }
} finally { $out.Dispose() }

if ((Get-Item -LiteralPath $destination).Length -ne $expectedBytes) {
  throw '合并结果的精确字节数不等于所有切片之和。'
}
Get-FileHash -LiteralPath $destination -Algorithm SHA256

CreateNew 会在目标文件已存在时失败,避免悄悄覆盖旧结果。确认哈希和后续测试都通过前,请保留原始切片。

Linux / WSL:shell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
parts=(./movie.001 ./movie.002 ./movie.003)
expected_bytes=$(stat -c '%s\n' "${parts[@]}" | awk '{sum += $1} END {print sum}')
destination=./movie.iso

# noclobber 防止覆盖已有目标;列表由人工按已核对顺序写出。
set -o noclobber
cat -- "${parts[@]}" > "$destination"
actual_bytes=$(stat -c '%s' "$destination")
[ "$actual_bytes" -eq "$expected_bytes" ] || {
  printf '%s\n' '合并结果的精确字节数不等于所有切片之和。' >&2
  exit 1
}
sha256sum "$destination"

在 macOS 或不支持 GNU stat -c 的系统上,使用该系统对应的精确字节数选项,或改在 Windows/Linux 环境中执行。拼接产物若本身是归档,仍应先 7z l、7z t,再解压到独立目录。

未知 .001 与故障处理

对来源不明的 .001,可执行 7z l ./name.001 作为只读探测,但失败并不能证明它是原始切片。不要根据失败结果自动 cat 或 copy /b。应寻找发布者的格式说明、完整清单、哈希及其使用的分卷工具。

7z t 报错时,先检查是否从正确卷开始、是否漏卷、文件名是否被改动,以及每卷或发布者指定对象的哈希是否匹配。哈希不匹配应重新获取对应文件;不要用其他批次的同名分卷替换。确认合并产物哈希正确、归档测试成功并且实际内容可用后,才考虑删除分卷。

参考资料