s3-turbo-list · Rust CLI

大桶 list / diff,不用自己搭扫描器

面向大规模 S3 兼容存储,自动发现可并行的 list / diff 工作。

Rust · Apache-2.0 · v0.23.0 · S3-compatible · Parquet · Agent-safe JSON

v0.21.0 实测

18.8 秒列举 100 万对象

2 vCPU 云主机 · 默认 list QPS · 北京 OSS。受限环境实测,不是性能上限。

1,000,413 对象Alibaba Cloud OSS · Beijingv0.21.0
不同并发下的完成耗时
42s 19s c=1 c=2 c=4 c=8 18.8s c=16 c=24 25.1s c=32 c=64

c=8 是 Parquet 参考运行;c=24 是特定调度异常,不代表通用性能边界。

2 vCPU · 3.4 GiB · same-region ECS → OSS · default list QPS · 2026-06-18
自动分段 listDiffFlag Parquetlist 可续跑

它解决什么

先回答大桶里的两个问题

迁移、排查或盘点之前,先弄清两件事:桶里有什么,以及两端到底差了什么。

LIST

弄清桶里有什么

把大规模 S3 兼容存储写成可分析的 Parquet list,不必先手动调一套扫描参数。

DIFF

弄清两端差了什么

对比源端和目标端的对象元数据,得到一份有序的差异结果。

不负责同步对象 它不复制对象,也不替代存储浏览器;它负责给后续判断留下可靠的依据。

为什么做

扫描之后,才是真正要做的事

大规模扫描通常不是终点。你需要一份 list 结果继续分析,或需要差异结果判断一次迁移是否完成。

s3-turbo-list 默认留下这两种结果。计划、恢复和证据能力只在任务需要时出现,命令本身保持克制。

list 如何自动展开

扫描会根据桶的结构调整

第一次 list 先识别桶里的前缀边界,有结构就并行展开;剩下的长尾片段再按需拆分。

  1. 01

    识别结构

    先探测真实的前缀边界,再开始递归扫描。

  2. 02

    并行列举

    利用这些边界展开并行任务,不必预先准备 hints 文件。

  3. 03

    处理长尾

    只有仍然耗时的片段,才会在有可用性能时继续拆分。

  4. 04

    写出 list

    最终留下可分析的 Parquet list,而不只是终端输出。

最后留下什么

list 和 diff 给出不同的答案

两条路径都会留下可继续处理的结果,但它们不是同一种操作。

LIST

一份可用的对象 list

一个存储桶 Parquet list

长任务可以从 checkpoint 继续;需要复查时,再查看可选的 trace 和运行记录。

DIFF

一份有序的差异结果

源端桶 + 目标端桶 带 DiffFlag 的 Parquet

两端会并行列举,再按 key 合并;下游可以直接筛出相同、缺失和变化的对象。

兼容性

扩大扫描前,先确认端点行为

已验证:AWS S3已验证:MinIO已验证:百度 BOSPreset:Cloudflare R2Preset:OSSPreset:B2

AWS S3、MinIO 和百度 BOS 走过项目的兼容性验证。R2、OSS、B2 提供 preset;无论哪种端点,都建议先运行 `compat-probe`。

常见问题与用法

为什么不用 aws s3 ls?

小规模、临时查看当然可以。s3-turbo-list 面向大规模盘点和可重复对比,结果输出和恢复能力更重要。

必须提前准备 hints 吗?

不需要。list 首次运行会探测真实的 `CommonPrefixes` 边界。hints 文件只是反复盘点时的额外控制。

启动发现如何工作?

启动发现会在 list 启动阶段用并行 single-key 探测为扁平命名空间预分区,让首次运行更早展开并发,而不必只靠运行时拆分逐步提升。

先跑一次 dry-run

打开仓库