Bash + rclone · OneDrive ↔ Google Drive · 开源操作指南
使用 Bash 和 rclone 执行仅复制的云端传输
rclone 已经能够处理云端分页、重试、可恢复传输和服务商哈希值。工程任务是将这些基础能力封装为一套默认拒绝且可感知容量的操作流程。
更新日期 ; 20 分钟读完.
简短回答
对于大型或无人值守的迁移,FileArk 是更简单的托管式选择:它在线运行传输,已针对数 TB 工作负载进行测试,并会在完成前检查每项结果。对于希望通过 shell 控制数据传输路径的操作者,这个采用 MIT 许可证的 Bash 封装程序会通过本地暂存按限定批次进行复制,对两个传输阶段逐字节验证,并且绝不删除源文件。
为何封装 rclone,而不是重新构建每个云服务商客户端
rclone 为 shell 工作流提供了成熟的云服务商抽象层、OAuth 配置、分页、重试机制、可恢复传输、并发控制、清单命令和验证命令。因此,这个封装程序可以专注于迁移过程中的不变约束:仅复制命令、有界暂存、容量预留、确定性文件列表和持久化进度。
但这并不意味着任务会自动完成。操作者仍需负责远程端配置、令牌安全、网络可用性、进程监管、本地磁盘、日志、服务商限制、失败对象审查和目标端验收。对于希望以托管式在线工作流运行该流程,而不是在自己的工作站或服务器上操作的用户,FileArk 正是为此而设计。
脚本明确禁止调用 rclone move、sync、delete、purge 或 rmdirs。它使用 lsf 和 about 进行探查,对两个传输阶段使用 copy,并使用 check --download 进行全字节验证。唯一会移除的是本地暂存目录中已经过验证的文件。
下载 Bash 版本和 MIT 许可证
下载 Bash 和 rclone 传输程序
一个仅复制的封装程序,提供批次限制、本地和目标端空间预留、全字节验证、检查点、重试控制以及无需网络的演示。fileark-cloud-transfer.sh · Bash 4+ · rclone · jq · MIT 许可证
下载 MIT 许可证
适用于两个 FileArk 手动传输脚本的许可声明。LICENSE-fileark-cloud-transfer.txt · MIT · 纯文本
运行无需联网的操作演示

即使尚未安装 rclone 或 jq,也可以安全运行演示,因为参数解析会在依赖项检查之前退出。输出会列出禁止执行的破坏性操作、显示两项容量预留,并在最后给出源文件删除数量。
chmod +x fileark-cloud-transfer.sh
bash -n fileark-cloud-transfer.sh
./fileark-cloud-transfer.sh --demo
./fileark-cloud-transfer.sh --help安装并配置操作所需的依赖项
请按照官方说明安装最新版本的 rclone,并通过操作系统的软件包管理器安装 jq。该封装脚本使用了严格的错误处理和现代条件表达式,因此需要 Bash 4 或更高版本。
运行 rclone config 并创建两个名称彼此独立的远程端,例如 onedrive: 和 gdrive:。如果政策或速率限制要求使用专用 OAuth 应用,请输入您自己的服务商客户端 ID 和密钥。rclone 会将 OAuth 令牌存储在其配置文件中;请通过严格的权限保护该文件,切勿将其与脚本打包在一起。
运行封装程序前,请使用只读列表命令和配额命令确认每个远程端。当范围仅涵盖一个子树时,请使用 onedrive:Department/Archive 之类的路径。
rclone version
rclone config
rclone lsd onedrive:
rclone lsd gdrive:
rclone about onedrive: --json | jq
rclone about gdrive: --json | jq在传输数据前冻结一份确定性清单
该封装程序以递归方式使用 rclone lsf,明确指定制表符作为分隔符并采用 sp 格式,从而生成“大小在前、路径在后”的输出。它会验证每个大小是否为数字、每条路径是否为相对路径,然后排除已存在于验证检查点中的路径。
Bash 版本会拒绝包含制表符、回车符或换行符的文件名,因为以换行符分隔的 --files-from-raw 列表无法无歧义地表示这些名称。如果存在此类名称,请使用 Python 版本或专门设计的清单格式。
路径检查点特意采用简单且易于检查的设计。它假定源路径在运行期间保持不变。如条件允许,请冻结对源端的写入;如果预计会有并发更改,则应重新生成清单并进行核对。
rclone lsf "$SOURCE" \
--recursive \
--files-only \
--format "sp" \
--separator