1159 字
6 分钟
Windows 使用 AWS CLI 一键同步本地目录到 S3(保留目录结构、可断点续传)

Windows 使用 AWS CLI 一键同步本地目录到 S3(保留目录结构、可断点续传)#

本文介绍如何在 Windows 上使用 AWS CLI,将本地目录 G:\awss3\profile 整体同步到 S3 存储桶 bucket-namecommon/profile/ 前缀下,并解释命令行为、断网恢复机制及验证方法。


1. 目标与效果#

目标#

将本地目录:

  • G:\awss3\profile\

完整上传到:

  • s3://bucket-name/common/profile/

最终结构示例#

假设本地存在:

  • G:\awss3\profile\avatar\1.png
  • G:\awss3\profile\upload\a\b\c.jpg

上传后在 S3 中对应为:

  • s3://bucket-name/common/profile/avatar/1.png
  • s3://bucket-name/common/profile/upload/a/b/c.jpg

说明:S3 的“文件夹”本质是对象 Key 的前缀(prefix),控制台展示为目录层级,但底层仍是对象键名字符串。


2. 前置条件#

  1. 已安装 AWS CLI v2
  2. 已完成凭证与默认区域配置(或后续使用 --profile 显式指定)

验证 AWS CLI 是否可用:

Terminal window
aws --version

验证是否能访问目标桶(需要具备 List/Put 权限):

Terminal window
aws s3 ls s3://bucket-name/

3. 核心命令#

执行同步上传:

Terminal window
aws s3 sync "G:\awss3\profile" "s3://bucket-name/common/profile/" --only-show-errors

参数解释#

  • aws s3 sync 同步本地目录与 S3 目标前缀,使目标端与源端内容一致(在不加 --delete 的情况下,只上传缺失/变更项,不会删除目标多余文件)。

  • "G:\awss3\profile" 本地源目录。CLI 会递归遍历该目录下所有文件与子目录。

  • "s3://bucket-name/common/profile/" S3 目标路径:桶名为 bucket-name,对象前缀为 common/profile/

  • --only-show-errors 只输出错误信息,减少控制台噪音,适合大量文件上传。


4. 命令会做什么:同步策略与覆盖规则#

aws s3 sync 的核心逻辑是“比较后上传”:

  1. 遍历本地文件,计算相对路径。

  2. 对比 S3 端同 Key 的对象(主要依据大小、修改时间等元数据)。

  3. 仅上传新增或发生变化的文件

  4. 默认情况下:

    • 不会删除 S3 端多出来的文件(除非显式加 --delete
    • 会覆盖 S3 端同 Key 且被判定为“不同”的对象

因此,重复执行同一条 sync 命令通常是安全且常见的操作。


5. 断网/中断后的行为:如何恢复#

5.1 中断会发生什么#

上传过程中若出现断网、VPN 掉线、电脑休眠等情况:

  • 当前正在传输的文件可能上传失败或中止
  • 其他未开始的文件当然不会上传
  • 已成功上传的文件保持在 S3 中,不会回滚

5.2 恢复方式(关键要点)#

直接重新执行同一条命令即可:

Terminal window
aws s3 sync "G:\awss3\profile" "s3://bucket-name/common/profile/" --only-show-errors

恢复机制说明:

  • sync 会再次比较本地与 S3
  • 已经成功上传且未变化的文件会被跳过
  • 缺失或未完成的文件会继续上传
  • 这相当于“可重复执行的增量同步”,实践中可视为断点续传式体验(无需人工记录进度)

注意:这里的“续传”是基于“已完成对象不重复上传、未完成对象会重传”的同步语义,而不是对单个小文件进行真正的分片续传。对于你这种 300–500KB 的小文件,重传成本很低,整体效果接近续传。


6. 上传完成后的验证方法#

6.1 查看上传结果汇总(推荐)#

递归列出并汇总总大小与对象数:

Terminal window
aws s3 ls "s3://bucket-name/common/profile/" --recursive --human-readable --summarize

6.2 预检查是否还存在差异(Dry Run)#

不实际上传,仅展示将要执行的操作:

Terminal window
aws s3 sync "G:\awss3\profile" "s3://bucket-name/common/profile/" --dryrun

若输出为空或无待上传项,通常表示源端与目标端已一致。


7. 常见注意事项#

  1. 谨慎使用 --delete --delete 会删除 S3 端存在但本地不存在的对象,适合“镜像同步”,但风险较高。若不确认目标前缀是否只用于本次同步,请不要加。

  2. 路径与斜杠的含义

    • 源路径写到具体目录:G:\awss3\profile
    • 目标路径通常以 / 结尾:.../common/profile/ 有利于明确前缀是目录语义。
  3. 权限要求

    • 至少需要对目标桶/前缀具备 s3:PutObject
    • 验证/列举通常需要 s3:ListBucket

8. 总结#

使用以下命令即可在 Windows 上将本地目录完整同步到 S3,并保持目录结构不变:

Terminal window
aws s3 sync "G:\awss3\profile" "s3://bucket-name/common/profile/" --only-show-errors

其优势在于:

  • 递归同步、保持目录结构
  • 可重复执行,适合断网或中断后的恢复
  • 增量上传,仅传变化/缺失文件,效率较高
  • 输出简洁,适合大量小文件场景

如需进一步提升稳定性与速度,可在网络条件较差或文件更多时再结合 CLI 的重试模式与并发参数进行优化。

Windows 使用 AWS CLI 一键同步本地目录到 S3(保留目录结构、可断点续传)
https://twenhub.com/posts/windows-shi-yong-aws-cli-yi-jian-tong-bu-ben-di-mu-lu-dao-s3-bao-liu-mu-lu-jie-g/
作者
Twenhub
发布于
2026-01-21
许可协议
CC BY-NC-SA 4.0