不解码,先查条目
find 把 glob 过滤作用于规范化后的 entry 元数据,完全不读取内容 —— 即使在数 GB 的压缩包上,路径发现也依然便宜。
v0.5.0 · MIT · Rust
面向 AI Agent 与人类的统一压缩文件访问层。先检视、按需流式读取压缩包内容,再决定是否解压。
v0.5 仅以源码形式发布 —— 尚未上架 crates.io,也没有预编译二进制。RAR 支持会静态链接 libarchive,平台依赖见下载页。
统一的 arcthis <command> <archive> [entry] 语法覆盖 ZIP、7z、RAR、TAR 与单流编码格式。以下所有会话都是 arcthis 0.5.0 的真实输出。
find 把 glob 过滤作用于规范化后的 entry 元数据,完全不读取内容 —— 即使在数 GB 的压缩包上,路径发现也依然便宜。
grep 以 entry 大小、行、匹配数和二进制探测为界,流式扫描普通文件 —— 搜索过程不写入任何磁盘。
hash 把单个 entry 流式送入 SHA-256 或 SHA-512;verify 用一次全流式通过校验结构与每一个可读 entry。
pack、extract 和 convert 都能输出类型化的 --dry-run 计划;先写入同级暂存位置,验证通过后才提交。
可重复的 --within 沿内层压缩包逐层深入,以有界内存 source 实现,最多 8 层 —— 绝不创建具名临时文件。
每个查询命令都通过 --json 输出 schema 版本化的 JSON:字段稳定、错误类型化写入 stderr、退出码确定。
检测以内容优先:误导性扩展名不会覆盖有效签名。格式差异由 backend 吸收,命令看到的是带能力标记的统一模型。
| 格式 | 访问 / 解压 | 创建 | 访问模型 |
|---|---|---|---|
| zip | Stored/Deflate,含 ZipCrypto/AES 解密 | Deflate,不加密 | 随机 entry 访问 |
| 7z | 支持,含 AES 解密 | LZMA2,不加密 | 取决于 block/solid 结构 |
| rar / rar5 | 经 libarchive 读取/解压 | 只读 | 顺序访问 |
| tar | 支持 | 支持 | 顺序访问 |
| tar.gz / tgz | 支持 | 支持 | 顺序解压 |
| tar.bz2 / tbz2 | 支持 | 支持 | 顺序解压 |
| tar.xz / txz | 支持 | 支持 | 顺序解压 |
| tar.zst / tzst | 支持 | 支持 | 顺序解压 |
| gzip | 单个隐式 entry | 支持 | 顺序访问 |
| bzip2 | 单个隐式 entry | 支持 | 顺序访问 |
| xz | 单个隐式 entry | 支持 | 顺序访问 |
| zstd | 单个隐式 entry | 支持 | 顺序访问 |
schema_version: "1" 的完整 JSON 文档,字段名与类型是公开的版本化接口。read 输出原始 entry 字节并拒绝 --json。inspect 报告 random_access、solid 等能力,Agent 可以在执行前推算操作成本。{ "schema_version": "1", "archive": { "path": "dataset.zip", "path_lossy": false, "format": "zip" } }
不可信压缩包是敌意输入。每一条写入路径都保守、可验证、事务化 —— 方便性选项存在,但必须显式声明。
解压拒绝 ..、绝对路径、Windows 盘符/UNC 前缀、NUL 字节,以及可能越界的链接。
输出先写入同级暂存位置,全部 entry 成功后才提交;失败不会留下伪装成成功的半成品。
已存在的目标默认拒绝;--overwrite、--skip-existing、--rename 三选一且必须显式指定。
--delete-source 只在 perform → finalize → verify → commit 完成后执行;任何错误、中断或验证失败都保留源文件。
2025-06-18,stdout 严格纯净。--allow-root 下始终可用。--allow-output-root 策略后出现。