通过 Web 控制台向 Amazon S3 上传一次文件没问题。但到第十次,或是第一次需要移动整个目录树时,你就会希望这条命令留在 shell 历史里。 aws s3 命令组提供了你熟悉的 Unix 风格 S3 操作: ls 列出、 cp 复制、 sync 同步目录、 rm 删除。

本指南展示了最常用的 aws s3 命令的实用示例,包括递归复制、包含和排除过滤器,以及使用 --dryrun 的安全删除。

前提条件

示例需要 AWS CLI 版本 2 以及有权访问你所使用 S3 资源的身份。如果 CLI 尚未就绪,请参阅我们在 Linux 上安装和配置 AWS CLI 的指南。

通过以下命令确认 CLI 可以验证您的账户身份:

终端
aws sts get-caller-identity

如果该命令打印出您的账户 ID 和 IAM 身份,则说明身份验证正常。当该身份缺乏所需的存储桶或对象权限时,个别 S3 命令仍可能返回 AccessDenied 错误。

AWS CLI 有两个针对 S3 的命令组。本指南中使用的 aws s3 组提供高级文件操作。 aws s3api 组暴露原始 API,每次调用对应一个操作,仅在管理存储桶策略或对象版本等任务时才需要。

S3 路径格式为 s3://bucket-name/key 。通用命令结构为:

aws s3 <子命令> [参数] [选项]

诸如 cp 、 mv 和 sync 等命令接受源和目标参数。其余命令操作单个 S3 路径,但 aws s3 ls 除外,它可以省略路径以列出所有存储桶。

列出存储桶和对象

不带任何参数运行 aws s3 ls 可列出账户中的所有存储桶:

终端
aws s3 ls
输出
2025-11-04 09:12:33 my-bucket
2026-01-15 17:40:21 my-site-backups

要列出存储桶的内容,请传入存储桶路径:

终端
aws s3 ls s3://my-bucket
输出
                           PRE logs/
2026-02-10 08:30:12    1048576 backup.tar.gz
2026-02-11 09:02:44       4523 notes.txt

标记为 PRE 的条目是前缀,相当于 S3 中的目录。要查看其中的内容,请在路径末尾添加斜杠,例如 aws s3 ls s3://my-bucket/logs/ 。

添加 --recursive 可遍历整个存储桶,并将其与 --human-readable 和 --summarize 结合使用,以获得可读的大小和总计信息:

终端
aws s3 ls s3://my-bucket --recursive --human-readable --summarize
输出
2026-02-10 08:30:12    1.0 MiB backup.tar.gz
2026-02-11 09:02:44    4.4 KiB notes.txt
2026-02-12 06:15:09   12.7 MiB logs/app.log

总对象数: 3
   总大小: 13.7 MiB

底部的摘要显示了当前在存储桶或前缀下列出的对象的数量和合并大小。它不包括启用版本控制的存储桶中的非当前版本。

使用 cp 上传和下载文件

cp 子命令可在您的机器和 S3 之间双向复制文件。要将文件上传到存储桶:

终端
aws s3 cp backup.tar.gz s3://my-bucket/
输出
upload: ./backup.tar.gz to s3://my-bucket/backup.tar.gz

对象将保留其原始名称。要将其存储在不同的键下,请写明完整的目标路径:

终端
aws s3 cp backup.tar.gz s3://my-bucket/backups/backup-2026-02-10.tar.gz

下载操作相同,只是参数顺序相反。 . 目标将文件保存到当前目录:

终端
aws s3 cp s3://my-bucket/backup.tar.gz .

您还可以直接在两个存储桶之间复制。传输在 AWS 内部完成,因此数据不会经过您的机器:

终端
aws s3 cp s3://my-bucket/backup.tar.gz s3://my-site-backups/backup.tar.gz

复制目录 #

要复制目录及其所有内容,请添加 --recursive :

终端
aws s3 cp ./logs s3://my-bucket/logs --recursive

当您只需要部分文件时,可以组合使用 --exclude 和 --include 。过滤器按给定顺序计算,后指定的过滤器优先,因此通常的模式是先排除所有内容,然后再包含所需内容:

终端
aws s3 cp ./logs s3://my-bucket/logs --recursive --exclude "*" --include "*.log"

这将仅上传 .log 文件,并跳过目录中的所有其他内容。

最有用的 cp 选项:

  • --recursive - 复制目录或前缀下的所有文件。
  • --exclude / --include - 按模式过滤文件;后指定的过滤器覆盖先前的过滤器。
  • --storage-class - 选择目标存储类,例如对于不常访问的备份使用 STANDARD_IA 。
  • --dryrun - 仅打印将要复制的内容,不实际传输任何数据。

流式传输至 S3 及从 S3 流式传输 #

cp 命令接受 - 作为标准输入或输出的占位符,这使您可以直接将数据通过管道传输到存储桶,而无需临时文件:

终端
pg_dump mydb | gzip | aws s3 cp - s3://my-bucket/backups/mydb.sql.gz

读取操作同样以相反方式工作。这将对象打印到标准输出,您可以在其中进一步通过管道传输:

终端
aws s3 cp s3://my-bucket/backups/mydb.sql.gz - | gunzip | head

使用 mv 移动和重命名对象

Amazon S3 不会原地重命名对象。 mv 命令将源复制到新键,然后删除源,因此请在运行前预览操作:

终端
aws s3 mv s3://my-bucket/report-draft.pdf s3://my-bucket/report-final.pdf --dryrun

仔细检查两条路径,然后在不带 --dryrun 的情况下再次运行命令。同一命令可以在您的机器和 S3 之间或两个存储桶之间移动文件。

使用 sync 同步目录

cp --recursive 每次都复制所有内容,而 sync 则传输缺失、大小不同或源修改时间较新的文件。要将本地目录镜像到存储桶:

终端
aws s3 sync ./website s3://my-bucket/website

再次立即运行,不会传输任何内容,因为两侧已经匹配。这使得 sync 成为重复性任务的正确工具,例如发布静态站点或发送每日备份。

反向操作会从存储桶下载新增和更改的对象:

终端
aws s3 sync s3://my-bucket/website ./website

在两个存储桶之间同步同样有效: aws s3 sync s3://my-bucket s3://my-site-backups 。

默认情况下, sync 从不删除任何内容。从源中移除的文件会保留在目标上。要使目标成为精确镜像,请添加 --delete ,但请先预览结果,因为删除的对象将永久消失:

终端
aws s3 sync ./website s3://my-bucket/website --delete --dryrun
输出
(dryrun) upload: website/index.html to s3://my-bucket/website/index.html
(dryrun) delete: s3://my-bucket/website/old-page.html

每一行都以 (dryrun) 为前缀,因此尚未发生任何操作。请检查 delete: 行,当计划看起来正确时,在不带 --dryrun 的情况下运行相同命令。

cp 中的 --exclude 和 --include 过滤器同样适用于此。一种常见用法是将仓库元数据排除在存储桶之外:

终端
aws s3 sync ./website s3://my-bucket/website --exclude ".git/*"

由于 sync 是幂等的,它与计划任务配合得很好。如果您希望每晚运行一次同步,请参阅我们关于使用 crontab 计划 cron 作业的指南。

使用 rm 删除对象

要删除单个对象,请传入其完整路径:

终端
aws s3 rm s3://my-bucket/old-backup.tar.gz
输出
delete: s3://my-bucket/old-backup.tar.gz
警告S3 中没有回收站。除非存储桶启用了版本控制,否则删除的对象无法恢复。始终先使用 --dryrun 测试递归删除。

要删除某个前缀下的所有内容,请添加 --recursive 并在操作前预览影响:

终端
aws s3 rm s3://my-bucket/logs/ --recursive --dryrun

如果列出的对象正是您预期的对象,请在不带 --dryrun 的情况下再次运行该命令以执行删除。

在启用了版本控制的存储桶上, rm 仅插入一个删除标记;先前的版本仍然存在并继续产生存储费用。要永久删除版本,需要使用带有版本 ID 的 aws s3api delete-object 调用。

创建和删除存储桶

mb(创建存储桶)子命令用于创建新存储桶。通用存储桶名称必须在 AWS 账户和 AWS 分区内的区域之间唯一,因此请选择不易冲突的名称:

终端
aws s3 mb s3://my-unique-bucket-name --region eu-central-1

rb(删除存储桶)子命令用于删除存储桶,但仅在存储桶为空时才能删除:

终端
aws s3 rb s3://my-unique-bucket-name

添加 --force 参数会先删除未版本化存储桶中的当前对象,然后删除存储桶。它不会永久删除对象版本或删除标记,因此当版本化存储桶中仍存在这些内容时,删除操作会失败。请像对待 rm --recursive 一样谨慎使用 --force。

生成临时下载链接

有时您需要将文件交给他人,但又不想公开存储桶。presign 子命令会生成一个授予对单个对象临时访问权限的 URL:

终端
aws s3 presign s3://my-bucket/report.pdf --expires-in 3600

该命令会打印一个长 URL,任何人都可以使用该 URL 在接下来的一小时(3600 秒)内下载该对象。默认有效期为 1 小时,最大有效期为 7 天。使用临时凭证签名的 URL 会在这些凭证过期时过期,即使 --expires-in 请求了更晚的时间也是如此。

快速参考

如需可打印的快速参考,请参阅 AWS CLI 速查表。

任务命令
列出所有存储桶aws s3 ls
列出存储桶内容aws s3 ls s3://bucket
递归列出并显示总计aws s3 ls s3://bucket --recursive --summarize
上传文件aws s3 cp file.txt s3://bucket/
下载文件aws s3 cp s3://bucket/file.txt .
上传目录aws s3 cp ./dir s3://bucket/dir --recursive
预览重命名对象aws s3 mv s3://bucket/old.txt s3://bucket/new.txt --dryrun
镜像目录aws s3 sync ./dir s3://bucket/dir
预览镜像期间删除过期文件aws s3 sync ./dir s3://bucket/dir --delete --dryrun
删除对象aws s3 rm s3://bucket/file.txt
预览删除前缀aws s3 rm s3://bucket/dir/ --recursive --dryrun
创建存储桶aws s3 mb s3://bucket
删除空存储桶aws s3 rb s3://bucket
临时下载链接aws s3 presign s3://bucket/file.txt

常见问题解答

cp --recursive 和 sync 有什么区别?
cp --recursive 每次运行都会复制所有文件。sync 会比较两侧,只传输新增或更改的文件,这对于重复任务来说更快且更经济。

我可以在 S3 路径中使用 shell 通配符吗?
不可以。AWS CLI 不会解析 S3 路径中的 Unix 风格通配符,例如 s3://bucket/*.log。请改用 --recursive 配合 --exclude 和 --include 过滤器。

如何删除存储桶中的所有文件?
对于未版本化的存储桶,先预览 aws s3 rm s3://bucket --recursive --dryrun,然后移除 --dryrun 将其清空。aws s3 rb s3://bucket --force 命令可以一步清空并删除未版本化的存储桶,但当存在对象版本或删除标记时会失败。