介绍
一个团队发布一个包含每日 CSV 报表的目录。你将上传目录,发布修改,并删除过时的存储报表,同时保护独立的归档。
请先完成 使用对象键和元数据组织文档,掌握其中的存储桶、对象键、前缀和下载概念。这个全新 VM 提供 CLI 连接、本地报表和一个只包含归档的存储桶。使用 Terminal 执行命令,并在旁边的 AWS View 标签页观察变化。
发布已准备好的报表目录
在本步骤中,你将把两份本地报表发布到 daily/ 前缀,并理解文件名如何映射为对象键。
使用 cd(更改目录)进入工作目录:
cd /home/labex/project
使用 ls 查看已准备好的报表目录,它会列出本地文件名:
ls reports
列表包含 monday.csv 和 tuesday.csv。两者都是 CSV 文件:标题行给出列名,逗号分隔每条记录中的值。使用打印文件内容的 cat 查看星期一报表:
cat reports/monday.csv
date,orders
2026-09-28,120
列出已准备好的存储桶。对于 S3 位置,--recursive 显示整个桶中的完整对象键:
aws s3 ls s3://labex-report-delivery/ --recursive
只有 archive/retention.txt 存在。归档属于独立的工作流程,必须在每日同步后保留。
aws s3 sync 依次接收源和目标。它会递归检查源目录中的文件;sync 不需要 --recursive。每个相对文件名都会成为目标前缀下的对象键。因此,reports/monday.csv 会成为 daily/monday.csv,而不是 daily/reports/monday.csv。
aws s3 sync reports/ s3://labex-report-delivery/daily/
命令报告星期一和星期二报表的上传;输出顺序可能不同。再次列出整个桶:
aws s3 ls s3://labex-report-delivery/ --recursive
你应找到三个对象键:archive/retention.txt、daily/monday.csv 和 daily/tuesday.csv。AWS View 显示相同的对象。点击 daily/monday.csv,读取已存储的两行 CSV 报表。归档位于你选定的 daily/ 目标范围之外。
同步修改和新报表
在本步骤中,你将更新一份报表、添加另一份报表,并传输这些变化,而不再次上传未变的报表。
当源和目标都没有变化时,可以安全地使用相同源和目标运行 sync:
aws s3 sync reports/ s3://labex-report-delivery/daily/
已有文件均为最新时,没有上传行。对于本地到 S3 的传输,CLI 会检查目标对象键是否缺失、大小是否不同,或者本地文件的修改时间是否更新。它不会持续监视目录:想要发布修改时,你需要运行 sync。
向星期一报表添加一批迟到的 25 个订单。printf 打印引号中的文本;\n 结束该行。Shell 的 >> 向本地文件追加内容,而不是替换内容:
printf '2026-09-28,25\n' >> reports/monday.csv
查看三行结果:
cat reports/monday.csv
date,orders
2026-09-28,120
2026-09-28,25
创建星期三报表。这里的 > 写入新文件,替换该路径已有的任何内容:
printf 'date,orders\n2026-09-30,150\n' > reports/wednesday.csv
发布前,存储的星期一报表仍为两行,AWS View 中还没有星期三报表。只修改本地文件不会改变 S3。
再次发布:
aws s3 sync reports/ s3://labex-report-delivery/daily/
你应看到已修改的星期一报表和新建星期三报表的上传。星期二报表没有变化,因此不会上传。这是增量传输:复制变化,而不是不加区分地复制每个文件。
在 AWS View 中,星期一报表现在显示迟到的订单批次,星期三报表也已出现。将星期一报表下载到独立的本地路径,以便比较实际存储的内容:
aws s3 cp s3://labex-report-delivery/daily/monday.csv retrieved-monday.csv
cmp 逐字节比较文件。内容一致时,它成功退出,不打印差异。&& 只在比较成功后打印消息:
cmp reports/monday.csv retrieved-monday.csv && echo 'Updated report matches'
Updated report matches
这确认更新已到达存储;仅凭命令成功消息,无法判断存储的是哪些字节。
下面的示例展示了更新后展开的存储星期一报表。星期三报表已存在,独立归档仍保留在桶中:

只对每日前缀进行镜像同步
在本步骤中,你将删除过时的目标报表,同时保护无关归档。
sync 的目标是 daily/;archive/ 位于该范围之外。

星期二报表已不属于发布的每日报表集合。使用 rm(删除)只删除这个本地文件。这是本地文件系统命令,因此不会删除 S3 对象:
rm reports/tuesday.csv
再次运行普通 sync:
aws s3 sync reports/ s3://labex-report-delivery/daily/
列出目标前缀:
aws s3 ls s3://labex-report-delivery/daily/ --recursive
星期二报表仍然存在。默认情况下,sync 复制缺失或更新的文件,但保留目标中的额外对象。只删除源文件不会删除它的存储副本。
镜像同步(mirror)让目标文件集合与源保持一致,包括删除。--delete 删除没有匹配源文件的目标对象键。先与 --dryrun 配合,显示计划操作但不执行:
aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete --dryrun
预演应只列出删除 daily/tuesday.csv。星期一和星期三报表与源一致,archive/retention.txt 位于 daily/ 之外。请保持目标前缀准确:使用桶根路径会将归档纳入操作范围。
检查计划删除操作后,去掉 --dryrun,运行相同操作:
aws s3 sync reports/ s3://labex-report-delivery/daily/ --delete
命令报告星期二报表已删除。查看整个桶,以便同时检查消失和保留的内容:
aws s3 ls s3://labex-report-delivery/ --recursive
剩余对象键为 daily/monday.csv、daily/wednesday.csv 和 archive/retention.txt。在 AWS View 中打开归档对象,确认它仍显示 Keep the archive outside daily synchronization.。镜像同步只影响选定前缀。
删除实验存储资源
在本步骤中,你将清理本练习创建的报表和归档,再删除空存储桶。
归档必须在每日镜像同步后保留,但它也是本练习拥有的一次性资源。现在可以明确删除它。先使用限定在 daily/ 的递归操作删除两个每日报表对象:
aws s3 rm s3://labex-report-delivery/daily/ --recursive
输出确认两份报表已删除。使用完整对象键删除归档:
aws s3 rm s3://labex-report-delivery/archive/retention.txt
确认存储桶为空:
aws s3 ls s3://labex-report-delivery/ --recursive
命令成功且没有对象行,证明桶为空。aws s3 rb(删除存储桶)现在可以删除容器:
aws s3 rb s3://labex-report-delivery
输出为 remove_bucket: labex-report-delivery。检查剩余存储桶:
aws s3 ls
没有剩余存储桶行。AWS View 在成功查询状态后显示 No buckets。本地报表文件仍可用于检查;删除存储资源不会删除这些本地副本。
总结
你将本地报表目录发布到 S3 前缀,在没有变化时重复同步,上传修改后的报表和新报表,并将下载的更新内容与源文件比较。你看到普通 sync 会保留目标中的额外对象,随后预览并执行了使用 --delete、限定在 daily/ 的镜像同步。
归档位于目标前缀之外,因此在该操作后保留。清理全部实验存储资源之前,你验证了新状态和保留的数据。以后执行流程时,请在运行 sync 前选择好源、目标和删除范围。



