尾部倒序截断(ZIP、7z、tar、.001 分卷)
所有操作系统和文件系统(包括 FAT32 与 exFAT)都原生支持从文件末尾截断缩短。ZIP 和 7z 的索引位于文件最末尾,因此 HatchZip 先将尾部索引备份至 <archive>.hatchzip-tail,随后从最后一个独立单元(文件或固实块)开始倒序解压,每提交一批就截断归档尾部。
一个 180 GB 的压缩包解压出 200 GB 文件时,使用 WinRAR、7-Zip 或 unzip 需要 380 GB 磁盘空间,因为压缩包与解压出的所有文件必须同时存在于磁盘上。HatchZip 只需要略多于 200 GB 的空间:它从归档末尾向前提取,每完成一批文件就将该部分从归档文件中裁切掉,实时腾出磁盘空间。
免费且开源,支持 Windows、macOS 和 Linux。同时提供原生桌面图形界面(支持系统右键菜单直接解压)与 hatchzip(简写 hz)命令行工具。
未签名提示:HatchZip 目前尚未购买商业代码签名证书。Windows 若弹出“Windows 已保护你的电脑”,请点击“更多信息”→“仍要运行”;macOS 首次打开后,请在“系统设置 → 隐私与安全性”中点击允许。 旧款 Intel 芯片 Mac 请下载 Intel 版 .dmg。
所有操作系统和文件系统(包括 FAT32 与 exFAT)都原生支持从文件末尾截断缩短。ZIP 和 7z 的索引位于文件最末尾,因此 HatchZip 先将尾部索引备份至 <archive>.hatchzip-tail,随后从最后一个独立单元(文件或固实块)开始倒序解压,每提交一批就截断归档尾部。
.tar.gz 是只能从头解码的单一压缩流。HatchZip 在修改任何数据前会先从头到尾完整读取一遍以校验所有 gzip CRC-32(损坏归档直接原样拒绝);随后从头向后解压,每输出 256 MiB 在 deflate 块边界记录恢复点(含 32 KiB 滑动窗口),并在 NTFS、APFS、ext4、XFS、btrfs 上通过文件打洞释放已解码的压缩字节。
在触碰第一个字节前,HatchZip 会完整推演整个解压批次,精确计算峰值所需空间(输出体积 + 最大单一解压单元或固实块)。默认保留 2 GB 可用空间(可通过 --keep-free 调整),防止系统盘被彻底写满。
每个文件在解压时实时校验 CRC-32;若发现损坏立即停止,损坏文件及其前面的数据仍安全保留在归档中。从不覆盖已存在的文件;对目录穿越(..)、重叠条目、重复路径及 setuid/setgid 权限直接拒绝;符号链接一律在所有普通文件写完后才创建。
从尾部未提交单元起,在扣除 --keep-free 后的当前可用空间内选取单元(单批次上限 512 个单元或 2 GB)。
工作线程并行解压至 <name>.hatchzip-part 临时文件,校验 CRC-32 与声明长度无误后重命名为正式文件名。
强制将批次数据刷入物理磁盘:Linux 调用一次 syncfs,macOS 调用 F_FULLFSYNC,其他系统逐文件与目录执行 fsync。
将新的 committed_len 与链接信息写入临时日志,落盘后原子替换 <archive>.hatchzip 并刷新目录项。
将归档文件截断至 committed_len(或删除已排空的分卷文件),释放出的磁盘块立即供下一批次复用。



| 系统平台 | 安装包 / 文件名 | 类型与说明 |
|---|---|---|
| Windows 10 & 11 (x64) | HatchZip-x64-setup.exe | 安装程序(当前用户安装,无需管理员权限,自动注册右键菜单) |
| macOS Apple Silicon (M1 及更新) | HatchZip-aarch64.dmg | 磁盘映像 (.dmg) |
| macOS Intel | HatchZip-x86_64.dmg | 磁盘映像 (.dmg) |
| Linux x64 (通用发行版) | HatchZip-x86_64.AppImage | AppImage 单文件应用 |
| Debian / Ubuntu (x64) | hatchzip_amd64.deb | deb 软件包 |
| Fedora / openSUSE (x64) | hatchzip-x86_64.rpm | rpm 软件包 |
| 系统平台 | 安装包 / 文件名 | 类型与说明 |
|---|---|---|
| Windows x64 | hatchzip-x86_64-windows.zip | zip |
| macOS Apple Silicon | hatchzip-aarch64-macos.tar.gz | tar.gz |
| macOS Intel | hatchzip-x86_64-macos.tar.gz | tar.gz |
| Linux x64 | hatchzip-x86_64-linux.tar.gz | tar.gz |
| Linux ARM64 | hatchzip-aarch64-linux.tar.gz | tar.gz |
curl -fsSL https://raw.githubusercontent.com/xevrion/hatchzip/main/install.sh | shirm https://raw.githubusercontent.com/xevrion/hatchzip/main/install.ps1 | iexcargo install hatchzip$ hatchzip check game.zip
game.zip 180.2 MB zip, 200.0 MB uncompressed in 22 entries
available 50.5 MB
standard extraction needs 200.0 MB
required 29.9 MB (+5.0 MB reserved)
available after 30.6 MB$ hatchzip extract game.zip # 解压至 ./game/ 并随进度移除原压缩包
$ hatchzip extract game.zip -o D:\Games\Foo # 解压至指定目录
$ hatchzip x game.7z.001 # 解压分卷压缩包(传入任意分卷文件名即可识别整组)
$ hatchzip extract rare.zip --verify-first # 在删除任何字节前先完整读取并校验所有文件校验和$ hatchzip extract game.zip # 按 Ctrl+C 暂停或断电重启后,再次执行同一命令即可接着解压
$ hatchzip restore game.zip # 放弃继续解压:为剩余未解压条目重写索引,恢复为 7-Zip/unzip 可正常打开的归档
$ hatchzip list game.7z # 查看归档内文件列表与体积(不做任何修改)
$ hatchzip test game.7z # 完整读取并验证所有文件校验和(不写入任何文件)| 参数 / 环境变量 | 作用说明 |
|---|---|
-o, --output <dir> | 指定输出文件夹。默认为归档同级目录下的同名文件夹(必须为空目录或尚不存在)。 |
--keep-free <size> | 设置 HatchZip 绝不占用的磁盘保底剩余空间(如 500MB、10GB),默认值为 2GB。 |
--verify-first | 在截断删除任何归档字节前,先完整读取归档并校验所有文件。适合无法重新下载的重要归档。 |
-y, --yes | 跳过交互式确认提示(非终端脚本调用时必传)。 |
--password / HATCHZIP_PASSWORD | 解密受密码保护的 ZIP(ZipCrypto/AES)与 7z(AES,含加密文件名列表)。会在删除任何数据前先用单个文件验证密码,且绝不落盘保存密码。 |
| 状态码 | 含义说明 |
|---|---|
0 | 成功完成解压或检查。 |
1 | 运行出错。若解压已开始,已完成批次的进度已安全保存在 .hatchzip 中。 |
2 | 命令行参数或用法无效。 |
3 | 剩余磁盘空间不足(未对归档做任何修改)。 |
4 | 归档损坏或含危险路径被拒绝(未删除任何数据)。 |
5 | 需要密码或提供的密码错误。 |
130 | 通过 Ctrl+C 手动暂停。再次运行相同命令即可继续。 |
| 测试归档样本 | unzip / 7-Zip | HatchZip 实测结果 |
|---|---|---|
| ZIP,180 MB | [FAIL]unzip 在第 6/21 个文件处因空间耗尽失败 | [PASS]顺利完成,所有文件逐字节完全一致 |
| 7z (7-Zip 25.01, -ms=20m, 10 个固实块) | [FAIL]需要 380 MB 空间 | [PASS]0.64 秒完成,所有文件逐字节完全一致 |
| 7z 分卷归档(5 个 40 MB 分卷) | [FAIL]需要 380 MB 空间 | [PASS]顺利完成;分卷逐个清空删除,峰值仅占用 210 MB |
| GNU tar 归档,200 MB | [FAIL]需要 400 MB 空间 | [PASS]0.12 秒完成,所有文件逐字节完全一致 |
| 7z 默认参数(整个归档为 1 个固实块) | [FAIL]需要 380 MB 空间 | [SAFE REFUSAL]在修改任何数据前安全拒绝:单个固实块必须全部解压完才能释放,因此需要 200 MB 可用空间 |
同样数据下 unzip 6.00 耗时 1.48 – 1.50 秒,且 HatchZip 包含了 unzip 跳过的 fsync 落盘操作。(由多核并行解压加速;若归档内仅单个超大文件则为单核解码速度。)
在支持稀疏文件打洞的文件系统上,每 256 MiB 释放一次归档字节,在 950 MiB tmpfs 上仅凭 367 MB 剩余空间完成解压(未启用流式打洞前需 629 MB)。
在每种格式运行过程中的多个批次临界不安全时刻强制杀死进程,所有续传均成功完成且输出逐字节一致。
测试环境:Fedora 43,Intel Core i7-14700HX,SK Hynix NVMe SSD,热页缓存(warm page cache);磁盘空间测试使用 220 MiB tmpfs 模拟接近写满的笔记本硬盘,速度测试在 ext4 上执行。
| 归档格式 | 支持详情 | 空间释放步长(粒度) |
|---|---|---|
| ZIP、ZIP64、自解压 .exe | 已支持。已测试:Stored、Deflate、Deflate64、bzip2、LZMA、PPMd、Zstandard 及超过 4 GiB 的条目。 | 按单个文件(对于 ≥512 MiB 的 Stored/Deflate 文件支持按 256 MiB 打洞释放) |
| 7z(固实与非固实) | 已支持。已通过 7-Zip 25.01 测试:LZMA2(默认)、LZMA、BCJ+LZMA2、bzip2、Deflate、PPMd。 | 按单个固实块(非固实归档按单个文件) |
| tar(未压缩) | 已支持,包含超长文件名、符号链接与硬链接。 | 按单个文件(对于 ≥512 MiB 的文件支持按 256 MiB 打洞释放) |
| .tar.gz / .tgz(含 pigz / bgzip 及 .tar.gz.001 分卷) | 已支持。修改前先从头到尾读取校验一遍;在 NTFS、APFS、ext4、XFS、btrfs 上边解压边打洞释放空间。在 FAT32/exFAT 上仍可解压和断点续传,但需同时容纳归档与文件的空间。 | 每输出 256 MiB 释放一次 |
| 分卷归档(.001, .002, …,ZIP 或 7z) | 已支持(7-Zip 生成的字节切分分卷)。 | 按文件或固实块;每个分卷一旦排空立即删除 |
| 密码保护的 ZIP 与 7z | 已支持(ZipCrypto、ZIP AES、7z AES 含加密文件列表)。在删除任何数据前先抽取一个文件验证密码。 | 与未加密归档一致 |
| .tar.zst、.tar.xz、RAR、原生 .z01 分卷 ZIP | 暂不支持 — 会在开始前安全拒绝,不修改任何文件。 | 规划中 |
使用 7-Zip 默认设置生成的 7z 往往将所有文件压缩进同一个固实块(1 solid block)。由于固实块必须完整解码后才能释放,因此需要足以容纳整个固实块的剩余空间。运行 hatchzip check 会在修改任何文件前提前告知。
HatchZip 边解压边截断原归档。如果下载的压缩包本身在中间某处损坏,损坏位置之前的文件会被解压出来,而归档已部分被截断。对于无法重新下载的珍贵文件,请加上 --verify-first 先全量校验再原地解压。
当解压暂停或中断时,同级目录下的 <archive>.hatchzip 和 <archive>.hatchzip-tail 保存着已从归档末尾裁切掉的目录索引。在解压彻底完成或执行 hatchzip restore 之前,请勿手动删除这两个文件。
在 btrfs 或 APFS 等支持快照的文件系统上,若原归档已被包含在某个快照中,其磁盘块需在该快照删除后才会真正释放。在 FAT32 与 exFAT 上,ZIP/7z/tar 的尾部截断正常工作,但 .tar.gz 无法使用文件中部打洞。