Olares olares-cli files rm 实战:批量删除的安全预检、目录意图判定与批处理协议解析
云原生后端运维【免费下载链接】TerminusOpen-Source Personal Cloud OS for Always-On Agents项目地址https://gitcode.com/gh_mirrors/terminus2/Terminus点击查看免费下载olares-cli files rm是 Olares 命令行工具olares-cli中files命令树下的删除子命令用于通过 per-user files-backend 的批量 DELETE 接口删除一个或多个远端文件/目录。本文以 olares-files-rm.md 为骨架结合 rm.go、internal/files/rm/rm.go、download/stat.go 等源码实现与测试用例完整讲解其语法、安全约束、预检机制、目录意图判定、受保护路径策略及底层 wire 协议帮助开发者和 AI Agent 安全、可脚本化地使用这一破坏性命令。阅读本文前建议先阅读 olares-shared SKILL活动 profile 模型、认证与 auth 门控和 olares-files SKILL路径命名空间、后端怪癖与版本门控命令的完整 flag 与 wire shape 以olares-cli files rm --help为准。命令概览语法、别名与 flagfiles rm删除 files-backend 上的一个或多个远端文件或目录命令定义在 cli/cmd/ctl/files/rm.goolares-cli files rm [-r|-R] [-f] remote-path...元素说明rm主动词另有两个别名remove、delete-r/--recursive递归删除目录BSD 拼写-R是同一 flag 的隐藏别名通过 PreRunE 回填到同一个布尔值-f/--force跳过交互式 y/N 确认不能绕过预检存在性检查remote-path...至少一个cobra.MinimumNArgs(1)强制遵循fileType/extend/subPath三段式前端路径语法见 olares-files-paths.mdrm支持的命名空间与ls/cat/download/rename一致drive、cache、sync、external、awss3、google、dropbox、tencentdrive/Common另有版本门控见后文。路径解析统一由 path.go 的 ParseFrontendPath 完成fileType必须是已知的十种存储类之一drive的extend必须精确为Home、Data或Common大小写敏感drive/home/...会直接报错。基本用法与命令示例以下示例完整摘自 olares-files-rm.md 并在源码中逐一得到验证# 删除单个文件无 -r默认走文件路径 olares-cli files rm drive/Home/Documents/old.pdf # 递归删除目录不带尾斜杠-r 声明目录意图 olares-cli files rm -r drive/Home/Backups/2024 # 递归删除目录带尾斜杠显式目录意图 olares-cli files rm -r drive/Home/Backups/2024/ # 混合目标批量删除-f 跳过确认脚本场景 olares-cli files rm -rf drive/Home/junk drive/Home/scratch/ # 批量两个同父兄弟 一个跨父目标 —— 折叠成 2 次 DELETE 调用 olares-cli files rm drive/Home/a.pdf drive/Home/b.pdf sync/repo/old.md底层 wire 协议按父目录折叠的批量 DELETErm的传输层在 cli/internal/files/rm/rm.go 中实现与 LarePass Web 应用apps/packages/app/src/api/files/v2/common/utils.ts的batchDeleteFileItems帮助函数保持同一形状——按父目录分组使 HTTP 请求数量最少例如删除散落在两个目录里的 200 个文件只需 2 次请求DELETE /api/resources/encParentDir/ body: {dirents: [...]}URL 中的encParentDir以fileType/extend/parent为原始路径经 encodepath.EncodeURL 按/分段 percent-encode与 JSencodeURIComponent对齐保留前导/尾随斜杠父路径缺失尾斜杠时 DeleteBatch 会自动补上以满足服务端FileParam.convert按/切分的校验。每个 dirent 是带前导斜杠的名称文件为/foo目录为/sub/。服务端由 files 仓库的 POSIX 驱动PosixStorage.Delete迭代处理。Planrm.go 中的 Plan负责把用户输入的目标按(fileType, extend, parent)分组、去重同一路径在命令行出现两次只发一个 dirent并保证输出顺序稳定分组按fileType extend parent排序组内 dirent 按名称字母序排序——这正是文档 Agent notes 中排序稳定、适合脚本使用的源码依据。# 测试 TestDeleteBatch_WireShape 锁定的线上形状 # DELETE /api/resources/drive/Home/Documents/ body: {dirents:[/a.pdf,/sub/]}安全约束破坏性动词的四条底线1. 默认要求确认意图y/N-f跳过作为破坏性动词rm默认在发送任何 DELETE 之前列出将删除的内容并询问proceed with deletion? [y/N]:。readYesNo 只接受以y或Y开头的回答与 Unixrm -i的宽松行为一致其余任何输入包括 EOF都视为否。-f跳过提示用于脚本。2. 非 TTY 环境默认拒绝在没有终端CI、管道 stdin的非交互环境即使没有-f命令会直接返回refusing to delete without --force in a non-interactive context (no TTY)而不是自作主张猜测用户意图。3.-f不绕过预检存在性检查-f只跳过确认提示不跳过 preflightRm 的存在性与类型校验——不存在的路径依然中止整个操作。这比 Unix 的rm -f更安全一个拼写错误不会导致批量操作删一半。4. 尾斜杠声明目录意图受保护名称拒绝删除详见下文两节。目录意图判定尾斜杠与-r的语义尾斜杠是这是目录的意图信号由frontendPathToRmTargetrm.go保留为IsDirIntent。planner 采用与 preflight 严格一致的有效目录意图规则effectiveDir : IsDirIntent || recursive用户输入有效目录意图线上 dirent结果rm foo无尾斜杠、无 -r否/foo文件形删除文件rm foo/尾斜杠、无 -r是—planner 拒绝path is a directory: pass -r/-R to remove itrm -r foo是/foo/目录形删除目录rm -r foo/是/foo/目录形删除目录关键设计一旦-r在命令行出现同一次调用中的每个目标都被当作目录处理无论用户是否键入了尾斜杠线上 dirent 一律带尾斜杠服务端走目录删除路径。这一规则由测试 TestPlan_RecursiveForcesDirDirent 锁定修复了早期版本加了-r却没删掉文件夹的回归问题。因此不要在同一次-r调用里混入要删除的文件若目标列表同时包含文件与目录拆成两次rm调用一次带-r一次不带。Preflight 存在性检查确认提示之前的快失败预检在确认提示之前运行因此 HTTP client 必须在提示前解析好见 runRm 的注释说明为何接受冷路径上额外的/api/refresh往返以换取干净、指名道姓的拒绝。满足以下任一条件即中止——且不会打印 will delete N entries 预览行目标路径在服务器上不存在拼写错误 / 过期路径用户键入了target/或传了--recursive但服务器上该条目实际是文件用户键入target无尾斜杠且未传--recursive但服务器上该条目实际是目录。Fail-fast 契约第一个拒绝项即中止整个批次TestPreflightRm_MultipleTargets_OneMissing 验证了中间目标缺失时只点名该目标、不再检查后续目标因为预览行不能对注定删不掉的条目撒谎。实现机制parent-listing 策略而非直接 GET预检复用files cat/files download/files cp同款的 Stat列出父目录、在items数组里按 basename 查找而不是直接GET /api/resources/encFilePath。原因是后端 List 处理器被硬编码为Content: true单文件 GET 会尝试把文件内容整个读进响应对 json/二进制/大文件返回 HTTP 500statByParentListing注释详述了这一点parent-listing 既更可靠也严格更省。父目录列表成功但叶子不在其中时合成一个 404 让IsNotFound谓词统一触发stat.go#L99-L121。网络成本每个目标一次 Stat当前不缓存父列表多目标rm a b c同父也会发 N 次 Stat——这是文档标注的未来优化点不是当前契约。受保护路径策略四类拒绝受保护路径由 rm.go 的 Plan 在发出任何请求之前于客户端拒绝与 LarePass GUI 的置灰逻辑apps/packages/app/src/stores/operation.ts的disableMenuItem/externalFolderWhiteList/externalAiFolderWhiteList对齐防止脚本产生 GUI 无法到达的状态。1.drive/Home/一级受保护名称Quirk #4drive/Home/下第一级的 11 个系统托管目录拒绝删除权威列表在 path.go 的 ProtectedDriveHomeChildrenHome Documents Pictures Movies Downloads Data Cache Code Music Ollama Huggingface匹配是精确、大小写敏感的pictures小写不触发保护只保护第一级drive/Home/Pictures/Trip2024/这类更深路径完全可删错误信息会枚举全部 11 个名字并建议改为删除其内容files rm -r drive/Home/name/entry相关测试TestPlan_RefusesProtectedDriveHomeChild 同时断言了Pictures 的子目录可删、drive/Data 下的 Pictures 可删、sync 仓库里的 Pictures 可删等反例确保护栏不过度扩张。2.external/node/的 AI 挂载点目录external/node/ai/深度 1以及external/node/ai/{output,model,comfyui,ollama}/深度 2是系统托管的 AI 挂载点目录Ollama / ComfyUI / Huggingface 读取器按名字查找拒绝删除rm.go 的 isProtectedExternalChild。该守卫先于下面的卷根守卫执行以给出更准确的AI mountpoint错误而非挂载盘错误TestPlan_RefusesProtectedExternalChild 显式锁定了这一顺序。ai/output/run-2026/这类更深路径仍是用户内容可自由删除。3.external/node/volume/卷根external/node/volume/如external/olares/USB-0/是 LarePass 管理的挂载点DELETE 处理器不知道如何卸载卷只会迭代卷内容并全部删除——表现为 2xx 成功但实际清空整块磁盘上的数据。因此客户端拒绝isExternalVolumeRoot并引导指向卷内子路径external/node/volume/sub/回归背景见 TestPlan_RefusesExternalVolumeRoot。4. 卷根一律拒绝frontendPathToRmTarget会把路径归约到fileType/extend根如drive/Home、sync/repo/的目标直接拒绝refusing to delete the root of fileType/extendrm.go防止rm drive/Home/误变成清空我的 Drive。5.drive/Common版本门控若任一目标落在drive/CommonOlares 应用公共数据区runRm 会先调用 requireCommonBackendVersion 门控要求后端 Olares ≥ 1.12.6否则给出可操作的升级/换命名空间提示版本不可探测时 fail-closed。确认流程与输出即使带-f删除前也会打印一行总览破坏性操作值得一行说明will delete 3 entries in 2 batches: drive/Home/Documents/ /a.pdf /b.pdf sync/repo/ /old.md proceed with deletion? [y/N]:默认交互等待 y/N回答非 y 则打印aborted并返回非 TTY 且无-f直接拒绝见安全约束第 2 条每组合并成一次 DELETE 后打印✓ drive/Home/Documents/ (2 entries)全部完成后打印done: deleted 3 entries按组串行删除组失败即中止剩余组让用户看到确切失败的组避免部分成功但说不清还剩什么的状态。错误处理与 HTTP 状态码映射reformatRmHTTPErr 把两类包rm.HTTPError来自 DeleteBatch、download.HTTPError来自预检 Stat统一映射状态码处理401 / 403转为标准认证错误 CTA令牌轮换或失效参见 olares-shared SKILL 的 auth 门控404预检路径报rm: not found on the server (HTTP 404)DeleteBatch 路径报delete fileType/extendparent: not found on the server (HTTP 404)其余原样透传附截断的响应体最多 500 字节ErrTokenInvalidated/ErrNotLoggedIn等类型化凭据错误原样透传不做二次猜测不要在认证错误上构建重试循环。Agent 使用规范先files ls父目录再建议rm让用户看到真实内容、确认 basename 大小写并给他们中止的机会ls细节见 olares-files-ls.md文件与目录混删属异常用法拆成两次rm调用一次带-r一次不带输出按fileType extend parent稳定排序、组内按名称排序适合脚本解析不要通过削弱安全 flag 来重试失败的预检如对不存在的路径加-f重试是被明确禁止的删除范围超出已命名目标如task cancel --all之外的并发删除时应停下并重新确认。常见错误速查表症状原因修复path is a folder; pass -r带了尾斜杠或实际是目录却没加-r加上-rpath is a file; remove the trailing slash意图不对把文件当目录删去掉尾斜杠refusing to delete drive/Home/protected-nameQuirk #4drive/Home/一级受保护名称换目标或操作嵌套更深路径refusing to delete external/node/volume/...卷根 / AI 挂载点目录指向卷内或ai/下的子路径path does not exist on the server路径过期 / 拼写错误先files ls父目录refusing to delete without --force in a non-interactive context非 TTY 且未加-f显式加-f需确认确实要删drive/Common ... requires Olares 1.12.6后端版本过低升级 Olares或改用drive/Home/drive/Data401/403令牌轮换或失效参见 olares-shared SKILL源码阅读指引如需继续深入建议按以下顺序阅读当前仓库命令入口与确认流程cli/cmd/ctl/files/rm.go预检行为测试cobra 层cli/cmd/ctl/files/rm_test.go分组 planner 与 DELETE 客户端cli/internal/files/rm/rm.goplanner / wire 形状测试cli/internal/files/rm/rm_test.goStat 的 parent-listing 策略cli/internal/files/download/stat.go路径解析与受保护名称权威列表cli/cmd/ctl/files/path.go版本门控cli/cmd/ctl/files/common_gate.go命令树与其余 verbcli/cmd/ctl/files/root.go技能文档olares-files SKILL、路径与命名空间、olares-shared SKILL赞分享云原生后端运维【免费下载链接】TerminusOpen-Source Personal Cloud OS for Always-On Agents项目地址https://gitcode.com/gh_mirrors/terminus2/Terminus点击查看免费下载相关推荐Bindu 仓库 PR 自动化测试技能test-pr实战指南从分支检出到合并建议的端到端质量门禁Bindu 仓库 PR 自动化测试技能test pr实战指南从分支检出到合并建议的端到端质量门禁 本文以 Bindu 仓库内建的 .agents/skil云原生后端运维Olares Router 用量与审计全解析olares-cli router usage / audit 命令实战指南Olares Router 用量与审计全解析 olares cli router usage / audit 命令实战指南 Olares 的 AI 网关 Ro云原生后端运维htmx 1.9.7 版本发布全解读hx-target-error、htmx:beforeHistoryUpdate 与七项关键修复的源码级解析htmx 1.9.7 版本发布全解读 hx target error 、 htmx:beforeHistoryUpdate 与七项关键修复的源码级解析 htm云原生后端运维上一篇EasyWeChat 短网址服务实战长链接转短链接提升二维码扫码性能下一篇FastGithub项目全览这个只需改一处DNS的开源GitHub加速神器到底有多香创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考