Ente CLI 导出命令 `ente export` 完全指南:从参数解析到源码级导出流程
Ente CLI 导出命令ente export完全指南从参数解析到源码级导出流程【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/enteEnte 是一个端到端加密的云服务照片、Locker 与 Auth 验证器数据而ente export是官方 Ente CLI 提供的核心数据导出命令。本文以 cli/docs/generated/ente_export.md 为骨架结合命令实现源码与配置示例带你逐参数、逐流程地掌握如何将 Ente 云端数据增量、可过滤地同步到本地磁盘并深入理解其背后的同步与解密机制。命令总览一次导出全库同步ente export是 cli/cmd/export.go 中注册在ente根命令下的子命令其唯一职责就是启动导出Starts the export process。完整命令语法如下ente export [flags]该命令没有位置参数全部行为由 flags 控制。它遍历 CLI 中已配置的所有账户对每个账户执行一次完整的「拉取远端元数据 → 比对本地状态 → 下载并解密文件」流程并且天然支持断点续传式的增量同步。选项一览表选项类型默认值说明--albums strings逗号分隔字符串列表空仅导出指定名称的相册--emails strings逗号分隔字符串列表空仅导出与这些邮箱共享的文件--exclude-albums strings逗号分隔字符串列表空排除指定名称的相册-h, --help布尔false显示 export 帮助信息--hidden布尔true默认包含隐藏相册传--hiddenfalse排除--shared布尔true默认包含共享相册传--sharedfalse排除说明文档中--hidden与--shared的默认值为true含义是「默认导出隐藏/共享相册」。由于 CLI 内部以「排除标志」实现因此想要不导出隐藏相册需要显式传入--hiddenfalse这正是源码注释中to exclude hidden albums, pass --hiddenfalse的由来。参数到过滤器的映射从 flag 到 model.Filter所有 flags 在 cli/cmd/export.go 中被读取并组装为一个model.Filter结构体随后交给ctrl.Export(filters)shared, _ : cmd.Flags().GetBool(shared) hidden, _ : cmd.Flags().GetBool(hidden) albums, _ : cmd.Flags().GetStringSlice(albums) emails, _ : cmd.Flags().GetStringSlice(emails) excludeAlbums, _ : cmd.Flags().GetStringSlice(exclude-albums) filters : model.Filter{ ExcludeShared: !shared, // --sharedfalse 时排除共享相册 ExcludeHidden: !hidden, // --hiddenfalse 时排除隐藏相册 ExcludeAlbums: excludeAlbums, Albums: albums, Emails: emails, } ctrl.Export(filters)对应的 flag 注册见 cli/cmd/export.go所有字符串参数都使用StringSlice类型因此既可以用--albums A,B传逗号分隔列表也可以重复传入--albums A --albums B。过滤器的判定逻辑model.Filter定义在 cli/pkg/model/filter.go包含ExcludeSharedFiles、ExcludeHidden、Albums、Emails、ExcludeAlbums等字段其判定规则账户级过滤SkipAccount当--emails非空时只有邮箱不区分大小写、忽略首尾空格匹配列表中任一邮箱的账户才会被导出其余账户直接跳过cli/pkg/model/filter.go。相册级过滤SkipAlbumcli/pkg/model/filter.go按顺序判断相册名是否命中--exclude-albums排除列表是否在--albums白名单之外当白名单非空时不在名单内的相册全部跳过是否命中ExcludeShared--sharedfalse跳过共享相册是否命中ExcludeHidden--hiddenfalse跳过隐藏相册。被跳过的相册会在日志中以Skipping album %s as its shared/hidden/not part of album to export的形式输出原因方便排查。前置条件账户与会话ente export本身不负责登录。运行前必须先通过ente account add添加账户命令内部会走完整的 SRP 密码登录、邮箱 OTP 验证、TOTP 二次认证、Passkey 校验流程见 cli/pkg/account.go并把加密后的 MasterKey、SecretKey、Token 等凭据持久化到本地 bbolt 数据库同时记录导出目录ExportDir。常用账户管理命令详见 cli/README.md# 添加已有账户注意不会新建账户创建新账户请用移动端/Web/桌面端 ente account add # 查看已配置账户会显示 Email、ID、App、ExportDir ente account list # 修改某账户的导出目录app 可取 photos / locker / auth ente account update --app photos --email emaildomain.com --dir ~/photosente export在执行时会从数据库读取全部账户cli/pkg/account.go因此一个导出目录 多个家庭成员账户的场景下一条命令即可同时导出所有人的数据。导出目录如何生效若账户未配置导出目录ExportDir为空该账户会被跳过并打印no export directory configured配置的目录也会先经过ValidateDirForWrite可写性校验校验失败同样跳过cli/pkg/sync.go。默认配置示例见 cli/config.yaml.example配置文件可放置于$HOME/.ente/config.yaml、当前工作目录的config.yaml或由ENTE_CLI_CONFIG_DIR指定的目录。导出流程源码级拆解当所有前置条件满足后ctrl.Export(filters)进入真正的同步逻辑cli/pkg/sync.go读取账户列表GetAccounts从 bbolt 数据库加载所有已配置账户账户级过滤应用--emails过滤跳过未命中账户应用类型判断Locker 应用目前不支持导出直接跳过日志输出Locker export is not supportedAuth 账户走SyncAuthAccount导出验证器数据Photos 账户走下述照片同步流程连接重试同步中若出现网络类错误model.ShouldRetrySync判定最多重试 20 次每次等待时间按retryCount * 10秒递增退避cli/pkg/sync.go。每个 Photos 账户的同步由SyncAccount完成cli/pkg/sync.go核心调用链为SyncAccount ├─ KeyHolder.LoadSecrets 加载本地密钥 ├─ fetchRemoteCollections 增量拉取相册元数据 ├─ fetchRemoteFiles 增量拉取文件元数据 ├─ createLocalFolderForRemoteAlbums 在本地创建相册目录结构 └─ syncFiles 下载并解密文件增量同步基于游标的断点续传导出不是全量重来而是增量的。fetchRemoteCollectionscli/pkg/remote_sync.go与fetchRemoteFilescli/pkg/remote_sync.go都通过记录在本地 bbolt 中的「上次同步时间戳」如CollectionsSyncKey、按相册粒度维护的CollectionsFileSyncKeyFmt作为游标只向服务端请求增量变更首次同步时lastSyncTime 0拉取全部元数据并记录最大UpdationTime后续同步从上次时间戳之后拉取服务端返回的hasMore用于分页翻取完整结果已从相册移除的文件IsRemovedFromAlbum在首轮全量同步中直接忽略避免产生无意义的删除操作。正是这套游标机制让ente export可以反复执行再次运行只会补拉增量、下载缺失文件而不会重复下载全部内容。本地目录结构相册、.meta 与 JSON 元数据createLocalFolderForRemoteAlbumscli/pkg/remote_to_disk_album.go在导出目录下为每个相册创建一个文件夹命名规则经过严格消毒sanitizeAlbumFolderName非法字符:/\|?*及控制字符替换为_去除首尾空格与结尾的点号空名或 Windows 保留名CON、PRN、AUX、COM1-COM9、LPT1-LPT9等见 cli/pkg/remote_to_disk_album.go自动加_前缀同名相册自动追加_1、_2后缀保证唯一uniqueAlbumFolderName。每个相册文件夹内包含一个隐藏的.meta子目录其中写入两类 JSON 元数据相册元数据album.json即 cli/pkg/model/export/metadata.go 中的AlbumMetadata记录相册 ID、OwnerID、相册名、是否删除、以及共享相册的所有者账户 ID 列表AccountOwnerIDs文件元数据每文件一个文件名.json即DiskFileMetadata见 cli/pkg/model/export/metadata.go记录标题、描述、地理位置、创建/修改时间、文件 ID、Hash以及 Live Photo / 连拍等多文件场景下的FileNames列表。相册被重命名时CLI 通过读取本地已有.meta完成目录改名映射相册在云端被删除时本地对应目录也会被同步清理。也就是说本地导出目录本身就是一份可被 CLI 识别的镜像下次运行会自动与云端状态对齐。文件下载与解密syncFilescli/pkg/remote_to_disk_file.go遍历相册条目跳过已SyncedLocally的文件逐个执行downloadEntry下载加密对象 → 用设备密钥解密 → 按原文件名写入相册目录 → 更新.meta下对应的 JSON 元数据 → 标记条目已同步。对于 Live Photo 等特殊格式解密后的 zip 会被解包拆分为独立的图片与视频文件分别落盘cli/pkg/remote_to_disk_file.go。解密失败ErrDecryption、Live Photo zip 损坏、时间戳异常等可控错误会被记录日志后跳过该文件保证单个文件异常不会中断整个导出。完整实战示例综合以上所有参数与机制以下是几种典型用法# 1. 全量导出所有账户的所有相册最常用 ente export # 2. 只导出旅行和家人两个相册 ente export --albums 旅行,家人 # 3. 排除某个相册 ente export --exclude-albums 临时截图 # 4. 只导出与 aliceexample.com 共享的内容 ente export --emails aliceexample.com # 5. 不导出共享相册与隐藏相册默认两者都会被导出 ente export --sharedfalse --hiddenfalse # 6. 组合使用限定相册 限定共享对象 排除特定相册 ente export --albums 旅行 --emails aliceexample.com --exclude-albums 旅行-2020执行时每个账户的日志都会带[app-email]前缀可据此区分多账户输出发生网络错误时 CLI 会自动退避重试无需人工干预。重复运行任意命令均可实现增量同步保持本地镜像与云端一致。相关命令与延伸根命令帮助见 cli/docs/generated/ente.md包含ente account、ente admin、ente auth、ente export、ente version五个子命令ente auth decrypt可离线解密 Ente Auth 的导出文件cli/cmd/authenticator.go配合ente export拉取 Auth 数据后即可使用构建与文档生成直接go build -o bin/ente main.go即可得到无依赖的静态二进制或使用仓库内的./release.sh脚本用go run main.go docs可重新生成 cli/docs/generated 目录下的全部命令文档见 cli/cmd/root.go若偏好容器化运行仓库提供 cli/docker-compose.yml 与 cli/Dockerfile其中cli-data卷为必需导出目录可另挂卷。小结ente export远不止一键下载这么简单它以model.Filter为核心实现了一套精准、可组合的导出筛选体系以 bbolt 数据库中的时间戳游标实现了可靠的增量同步以.metaJSON 元数据在本地维护了可复现的相册镜像并通过退避重试与单文件容错保证了长任务的稳定性。无论是个人备份、家庭多账户归档还是配合ente auth decrypt做验证器数据迁移掌握本文的参数与源码逻辑都能让你更安全、更高效地掌控自己的数据。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考