aws s3 ls 教程:列出 S3 对象 – wiki基地


AWS S3 ls 命令详解:列出您的云存储对象

引言

Amazon Simple Storage Service (S3) 是 AWS 提供的一项高度可扩展、可靠且低成本的对象存储服务。无论您是存储网站静态文件、备份数据、媒体文件,还是大数据湖,S3 都是一个理想的选择。与 S3 交互的方式多种多样,包括 AWS 管理控制台、AWS SDK 以及 AWS Command Line Interface (CLI)。

对于许多开发者和系统管理员来说,AWS CLI 是一个强大且高效的工具。它允许您通过命令行与 AWS 服务进行交互,执行各种操作,例如上传、下载、删除、复制对象,以及管理存储桶。在 S3 的日常管理中,最基本、最常用的操作之一就是列出存储桶中的对象

本文将详细探讨如何使用 AWS CLI 中的 aws s3 ls 命令来完成这项任务。我们将从最基本的用法开始,逐步深入到各种高级选项和实际应用场景,帮助您全面掌握这个工具,从而更有效地管理您的 S3 资源。

什么是 aws s3 ls 命令?

aws s3 ls 命令是 AWS CLI s3 子命令集中的一个重要成员。它的主要功能是列出 S3 存储桶或存储桶中特定路径(前缀)下的对象和/或通用前缀(Common Prefixes)。可以将其类比于在本地文件系统中使用的 lsdir 命令,但它是针对云存储环境设计的。

使用 aws s3 ls,您可以快速了解存储桶的内容结构,查看对象名称、大小、最后修改时间等基本信息。这对于数据探索、验证上传是否成功、查找特定文件或者了解存储桶的使用情况都非常有帮助。

前提条件

在开始使用 aws s3 ls 命令之前,您需要确保满足以下几个条件:

  1. 拥有一个 AWS 账户: 您需要一个有效的 AWS 账户才能访问和使用 S3 服务。
  2. 安装 AWS CLI: 确保您的计算机上已经安装了 AWS CLI。您可以访问 AWS 官方文档获取安装指南(https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。AWS CLI 支持多种操作系统,包括 Windows, macOS 和 Linux。
  3. 配置 AWS CLI: 安装完成后,您需要配置 AWS CLI,使其能够访问您的 AWS 账户。这通常涉及到运行 aws configure 命令,并提供您的 Access Key ID, Secret Access Key, 默认区域以及输出格式。请确保您配置的用户或角色拥有访问目标 S3 存储桶及其中对象的权限(通常是 s3:ListBucket 权限,对于 ls --versions 可能还需要 s3:ListBucketVersions)。

满足上述条件后,您就可以打开终端或命令行界面,开始使用 aws s3 ls 命令了。

基本用法

aws s3 ls 命令的最基本形式有两种:

  1. 列出所有存储桶: 只输入 aws s3 ls,不带任何参数。
  2. 列出特定存储桶中的对象: 输入 aws s3 ls s3://<bucket-name>,其中 <bucket-name> 是您要查看的存储桶的名称。

让我们分别来看这两种用法。

1. 列出所有存储桶 (aws s3 ls)

当您只运行 aws s3 ls 命令时,它会列出与当前配置的 AWS 账户相关联的所有存储桶(并且您具有 s3:ListAllMyBuckets 权限)。

命令:

bash
aws s3 ls

示例输出:

2023-10-27 10:00:00 my-first-s3-bucket
2023-10-28 11:30:15 another-project-data
2023-10-29 14:05:40 my-website-assets

输出解释:

每行输出代表一个存储桶。输出包含两列:

  • 创建日期和时间: 存储桶创建时的日期和时间(UTC)。
  • 存储桶名称: 存储桶的唯一名称。

通过这个简单的命令,您可以快速概览您账户下的所有 S3 存储资源。

2. 列出特定存储桶中的对象 (aws s3 ls s3://<bucket-name>)

这是 aws s3 ls 命令更常用的形式,用于查看特定存储桶的内容。

命令:

bash
aws s3 ls s3://<bucket-name>

示例: 假设您有一个名为 my-first-s3-bucket 的存储桶,其中包含一些文件和一个模拟的子文件夹(通过前缀实现)。

bash
aws s3 ls s3://my-first-s3-bucket

示例输出:

PRE folder1/
2023-10-27 10:01:20 120 file1.txt
2023-10-27 10:02:55 56789 document.pdf
2023-10-27 10:03:10 1500 image.jpg

输出解释:

这次的输出格式有所不同。它列出了存储桶根目录下的对象通用前缀(Common Prefixes)

  • 通用前缀 (Common Prefixes):PRE 开头的一行表示一个通用前缀。在 S3 中,并没有像传统文件系统那样的实际文件夹。文件夹结构是通过对象键(Key)中使用斜杠 (/) 作为分隔符来模拟的。例如,一个对象键是 folder1/file2.txt。当您在 s3://my-first-s3-bucket/ 下执行 ls 时,AWS CLI 会查找所有对象键中第一个斜杠之前的部分,并将这些唯一的部分作为通用前缀列出。这就像列出文件夹下的子文件夹一样。folder1/ 后面的斜杠表示它是一个前缀。
  • 对象: 不以 PRE 开头的行表示存储桶中的一个对象。每行对象信息包含三列:
    • 最后修改日期和时间: 对象最后一次被修改的日期和时间(UTC)。
    • 大小: 对象的大小,以字节为单位。
    • 对象键 (Object Key): 对象的完整名称,包括任何模拟文件夹的前缀。这类似于文件在文件系统中的路径和文件名。

通过这个命令,您可以清晰地看到存储桶根目录下的内容概况。

使用前缀进行过滤和导航

S3 中的前缀(Prefix)是对象键中从开头到第一个斜杠之间的部分(或者更广义地说,是对象键开头的任何字符串)。它们是组织和查找 S3 对象的关键。aws s3 ls 命令允许您通过指定前缀来列出特定“路径”下的对象。

命令:

bash
aws s3 ls s3://<bucket-name>/<prefix>

<prefix> 是您要列出其内容的起始字符串。注意,如果前缀以斜杠结尾(例如 folder1/),通常会列出该“文件夹”下的内容;如果不以斜杠结尾(例如 document),则会列出所有以 document 开头的对象和通用前缀。通常情况下,为了模拟文件夹导航,我们会使用以斜杠结尾的前缀。

示例: 列出 my-first-s3-bucket 存储桶中 folder1/ 前缀下的内容。

bash
aws s3 ls s3://my-first-s3-bucket/folder1/

假设 folder1/ 下有两个文件 file2.txtimage2.png,还有一个模拟的子文件夹 subfolder/

示例输出:

PRE subfolder/
2023-10-27 10:05:15 250 file2.txt
2023-10-27 10:06:30 3456 image2.png

这个输出显示了 folder1/ 这个前缀下的对象 (file2.txt, image2.png) 和通用前缀 (subfolder/)。这有效地模拟了进入 folder1 文件夹并列出其内容的操作。

您可以继续深入到更深层的前缀:

bash
aws s3 ls s3://my-first-s3-bucket/folder1/subfolder/

假设 subfolder/ 下有一个文件 file3.csv

示例输出:

2023-10-27 10:08:00 1234 file3.csv

通过指定不同的前缀,您可以精确地列出存储桶中您感兴趣的任何“路径”下的对象和子前缀。

高级选项

aws s3 ls 命令提供了一些有用的选项来增强其功能。

1. 递归列出所有对象 (--recursive)

默认情况下,aws s3 ls 在指定存储桶或前缀时,只会列出当前“层级”下的对象和通用前缀。如果您想列出指定前缀(或整个存储桶)下的所有对象,包括所有子前缀中的对象,您需要使用 --recursive 选项。

命令:

bash
aws s3 ls s3://<bucket-name>/<prefix> --recursive

<prefix> 是可选的。如果不指定前缀,则会递归列出整个存储桶中的所有对象。

示例: 递归列出 my-first-s3-bucket 存储桶中 folder1/ 前缀下的所有对象。

bash
aws s3 ls s3://my-first-s3-bucket/folder1/ --recursive

假设存储桶结构如下:
my-first-s3-bucket/
├── file1.txt
├── document.pdf
├── image.jpg
└── folder1/
├── file2.txt
├── image2.png
└── subfolder/
└── file3.csv

运行 aws s3 ls s3://my-first-s3-bucket/folder1/ --recursive 的输出可能会是:

2023-10-27 10:05:15 250 folder1/file2.txt
2023-10-27 10:06:30 3456 folder1/image2.png
2023-10-27 10:08:00 1234 folder1/subfolder/file3.csv

输出解释:

使用 --recursive 后,输出只包含对象,没有通用前缀。每个对象的完整键都会被列出,显示了它在存储桶中的完整路径。

注意事项: 对于包含大量对象(例如数十万、数百万或更多)的存储桶,使用 --recursive 可能会生成非常长的输出,并且需要较长时间来完成。请谨慎使用此选项,特别是在自动化脚本中,以免产生过大的输出或消耗过多资源。在处理大量对象时,通常更好的做法是结合前缀来缩小范围,或者考虑使用 s3api list-objects-v2 命令,它可以提供更精细的控制和输出格式选项。

2. 列出对象版本 (--versions)

如果您的存储桶启用了版本控制(Versioning),S3 会为对象的每次修改或删除保留一个版本。aws s3 ls 命令默认只显示每个对象的最新版本。如果您想查看对象的所有版本,可以使用 --versions 选项。

命令:

bash
aws s3 ls s3://<bucket-name>/<prefix> --versions

<prefix> 是可选的,用于指定只列出某个前缀下的对象版本。

示例: 假设 my-first-s3-bucket 启用了版本控制,并且 document.pdf 对象被修改了两次,最后还被删除了(生成了一个删除标记)。

bash
aws s3 ls s3://my-first-s3-bucket/ --versions

示例输出(简化):

2023-10-27 10:01:20 120 AAAAAAAAA file1.txt
2023-10-27 10:02:55 56789 BBBBBBBBB document.pdf
2023-10-27 10:10:00 60000 CCCCCCCCC document.pdf
2023-10-27 10:15:00 - DDDDDDDDD document.pdf (Delete Marker)
2023-10-27 10:03:10 1500 EEEEEEEEE image.jpg
2023-10-27 10:05:15 250 FFFFFFFFF folder1/file2.txt
2023-10-27 10:06:30 3456 GGGGGGGGG folder1/image2.png
2023-10-27 10:08:00 1234 HHHHHHHHH folder1/subfolder/file3.csv

输出解释:

使用 --versions 后,输出格式会有变化。每行代表一个对象的特定版本或一个删除标记。输出通常包含:

  • 最后修改日期和时间: 该版本的最后修改时间。
  • 版本 ID: 每个版本都有一个唯一的 ID。删除标记也有一个版本 ID。
  • 大小: 该版本的对象大小(字节)。对于删除标记,大小显示为 -
  • 对象键: 对象的键。
  • 是否是最新版本: 默认输出格式中可能不直接显示“是否最新”,但通常列表中会包含标记为 (Delete Marker) 的行,表示这是一个删除标记。要获取更详细的版本信息,如哪个版本是最新的 (IsLatest 标志),使用 s3api list-object-versions 命令会更合适。aws s3 ls --versions 主要是提供一个快速概览。

注意: --versions--recursive 可以结合使用,以递归方式列出某个前缀下的所有对象的所有版本。例如:aws s3 ls s3://my-first-s3-bucket/folder1/ --recursive --versions

3. 显示人类可读的大小 (--human-readable)

默认情况下,对象大小以字节为单位显示。对于较大的文件,这个数字可能难以快速理解。虽然 aws s3 ls 命令本身没有一个专门的 --human-readable 选项来转换大小单位(这个选项在 aws s3 cp, aws s3 sync, aws s3 mv 等命令中更常见),但AWS CLI 全局配置选项 --human-readable 可以影响某些命令的输出,包括 s3 ls 中的大小列

命令:

“`bash
aws s3 ls s3:/// –human-readable

或者在配置中设置 output=json 或 text 格式,并使用 –query 转换(更复杂)

或者将输出传递给外部工具如 awk 进行转换(更灵活)

“`

示例使用全局选项:

bash
aws s3 ls s3://my-first-s3-bucket/ --human-readable

示例输出(如果全局选项生效):

PRE folder1/
2023-10-27 10:01:20 120 Bytes file1.txt
2023-10-27 10:02:55 55.4 KiB document.pdf
2023-10-27 10:03:10 1.5 KiB image.jpg

注意: 依赖于 AWS CLI 版本和配置,--human-readable 全局选项对 s3 ls 输出的影响可能有限或需要特定输出格式(如 text)。更稳健的方法是将输出通过管道传递给其他命令行工具(如 awknumfmt)进行大小格式化。

使用外部工具进行大小转换示例:

bash
aws s3 ls s3://my-first-s3-bucket/ | awk '{print $1, $2, ($3/1024/1024 " MB"), $4}' # 简单示例,转换为 MB

这个 awk 命令是一个基础示例,它假定输出格式固定,并将第三列(大小)除以 1024*1024 转换为 MB。更复杂的脚本可以根据大小自动选择合适的单位 (KB, MB, GB)。不过,这超出了 aws s3 ls 本身的直接功能范围。

4. 控制输出 (--page-size, --max-items)

对于包含大量对象(例如数万个)的存储桶,一次性列出所有对象可能会导致 CLI 客户端需要处理和显示大量数据,这可能比较慢。AWS CLI 通过分页(Pagination)来管理大型数据集。

  • --page-size <value>: 指定 CLI 每次向 AWS 服务请求多少个项目。调整这个值可以影响 API 调用的效率。例如,--page-size 1000 表示每次请求 1000 个对象。
  • --max-items <value>: 指定在本地处理和显示的最大项目数。CLI 会继续进行 API 调用直到达到这个总数。这对于您只想查看列表的前 N 项非常有用。

命令:

bash
aws s3 ls s3://<bucket-name>/ --page-size 1000 --max-items 5000

示例解释:

这个命令会列出存储桶 my-large-bucket 中的对象。它会每次向 S3 请求 1000 个对象,直到总共列出了 5000 个对象为止。

这些选项在处理非常大的存储桶时非常有用,可以帮助您管理输出的大小和命令执行时间。

结合其他命令行工具

aws s3 ls 命令的强大之处在于其输出是标准文本格式,可以轻松地通过管道 (|) 传递给其他 Unix/Linux 命令行工具进行进一步的处理、过滤和分析。这是实现更复杂任务的关键。

以下是一些常见的结合使用示例:

1. 查找特定类型的文件

使用 grep 命令可以过滤 ls 的输出,只显示匹配特定模式的对象。

示例: 查找存储桶 my-first-s3-bucket 中所有 .log 文件(无论层级)。

bash
aws s3 ls s3://my-first-s3-bucket/ --recursive | grep ".log$"

解释:
* aws s3 ls s3://my-first-s3-bucket/ --recursive: 递归列出存储桶中的所有对象。
* |: 将 ls 命令的输出作为输入传递给下一个命令。
* grep ".log$": 过滤输入行,只显示以 .log 结尾的行。$ 符号确保匹配的是文件名的结尾,而不是路径中的任何地方。

2. 统计文件数量

使用 wc -l 命令可以统计 ls 输出的行数,从而得到对象或存储桶的数量。

示例 1: 统计您的 AWS 账户中有多少个 S3 存储桶。

bash
aws s3 ls | wc -l

示例 2: 统计存储桶 my-first-s3-bucket 中总共有多少个对象(包括子文件夹中的)。

bash
aws s3 ls s3://my-first-s3-bucket/ --recursive | wc -l

注意: 这个方法统计的是递归列出的“行”数,对应于对象的数量。如果输出中包含通用前缀(未使用 --recursive 时),则需要先过滤掉通用前缀行,再统计对象行数。

3. 按大小或时间排序

使用 sort 命令可以对 ls 的输出进行排序。由于 ls 输出中大小和时间是固定格式的,我们可以利用 sort 的列排序功能。

示例: 列出存储桶 my-first-s3-bucket 中按文件大小排序(从小到大)的对象。

bash
aws s3 ls s3://my-first-s3-bucket/ --recursive | sort -k 3 -n

解释:
* aws s3 ls s3://my-first-s3-bucket/ --recursive: 递归列出所有对象。
* |: 管道。
* sort: 排序命令。
* -k 3: 根据第三列(文件大小)进行排序。
* -n: 将第三列的内容按数值进行排序(而不是按字母顺序)。

要按时间排序(从旧到新),可以使用 sort -k 2 (基于时间戳的第二列)。

示例: 列出存储桶中最近修改的 5 个对象(按时间倒序排序)。

bash
aws s3 ls s3://my-first-s3-bucket/ --recursive | sort -k 2 -r | head -n 5

解释:
* sort -k 2 -r: 根据第二列(时间戳)进行排序,-r 表示倒序(最新的在前面)。
* head -n 5: 只取排序结果的前 5 行。

4. 查找大文件

结合 awksort 可以找出存储桶中最大的文件。

示例: 找出存储桶 my-first-s3-bucket 中大于 1MB 的文件,并按大小倒序排列。

bash
aws s3 ls s3://my-first-s3-bucket/ --recursive | awk '$3 > 1024*1024 {print $0}' | sort -k 3 -r -n

解释:
* aws s3 ls s3://my-first-s3-bucket/ --recursive: 递归列出所有对象。
* |: 管道。
* awk '$3 > 1024*1024 {print $0}': 这是一个 awk 脚本。它检查每一行的第三列($3,即文件大小)。如果大小大于 1MB (1024*1024 字节),则打印整行 ({print $0})。
* |: 管道。
* sort -k 3 -r -n: 对 awk 过滤后的结果,根据第三列(大小)按数值进行倒序排序。

这些示例仅仅展示了 aws s3 ls 命令与标准命令行工具结合使用的一些可能性。您可以根据具体需求,灵活地组合 grep, awk, sort, head, tail, xargs 等工具来完成更复杂的任务。

性能考虑和最佳实践

在使用 aws s3 ls 命令时,特别是在处理大型存储桶时,需要注意一些性能和效率问题:

  1. --recursive 的影响: 如前所述,对大型存储桶或前缀使用 --recursive 会列出所有对象,可能产生巨大的输出。尽量缩小前缀范围,或者使用 --max-items 来限制输出。
  2. API 调用: aws s3 ls 命令实际上是在底层调用 S3 的 ListObjectsV2 (或 ListObjects) API。对于非常大的存储桶,这会产生多次 API 调用(分页)。虽然 CLI 会自动处理分页,但了解这一点有助于理解命令执行所需的时间。
  3. 使用前缀: 充分利用前缀是提高 ls 效率的关键。与其对整个存储桶进行递归列出,不如针对需要查看的具体前缀进行操作。
  4. 过滤在本地进行: aws s3 ls 命令本身提供的过滤能力有限(主要通过前缀)。大多数复杂的过滤(如按大小、时间、文件名模式)都是在 CLI 获取所有数据之后在本地进行的(例如通过 grep)。对于非常大的数据集,这可能意味着需要先下载所有对象的元数据到本地进行处理,这会消耗时间和内存。如果您需要在 API 层面进行更精细的过滤(例如,只列出以特定字符串开头以特定字符串结尾的对象),可能需要考虑使用 aws s3api list-objects-v2,它提供了更多的参数(如 Prefix, Delimiter, StartAfter 等),虽然使用起来比 s3 ls 复杂。
  5. 权限: 确保您用于配置 AWS CLI 的身份拥有足够的权限来执行 s3:ListBucket 操作,对于 --versions 还需要 s3:ListBucketVersions 权限。如果没有,您将收到访问被拒绝的错误。

aws s3 ls vs aws s3api list-objects-v2

简单提一下 aws s3 lsaws s3api list-objects-v2 之间的区别。

  • aws s3 ls 这是一个高级(high-level)命令。它提供了简单、易用的接口,用于执行常见的 S3 文件操作(类似文件系统的命令)。它的输出格式固定,适用于人阅读和基本的管道处理。它内部使用了 S3 API,但抽象了许多细节(如分页)。
  • aws s3api list-objects-v2 这是一个低级(low-level)命令,直接映射到 S3 API 操作。它提供了更多的控制和参数选项,例如控制分页标记、指定分隔符、返回更多对象元数据(如存储类、ETag、用户自定义元数据等)。它的输出格式默认为 JSON,更适合在脚本中进行结构化数据处理。

对于简单的列出需求,aws s3 ls 通常是首选,因为它更直观和方便。但如果您需要在脚本中进行更复杂的自动化、需要获取更多对象元数据,或者需要更精细地控制 API 调用行为,那么 aws s3api list-objects-v2(或 list-object-versions)可能是更好的选择。

总结

aws s3 ls 命令是 AWS CLI 中用于管理 Amazon S3 存储桶不可或缺的工具。它提供了一个快速、简便的方式来查看存储桶、对象以及模拟的文件夹结构。

通过本文的详细讲解,您应该已经掌握了:

  • 如何使用 aws s3 ls 列出所有存储桶。
  • 如何使用 aws s3 ls s3://<bucket-name> 列出存储桶根目录下的对象和通用前缀。
  • 如何使用前缀 (s3://<bucket-name>/<prefix>) 过滤和导航到特定的“路径”。
  • ls 命令输出的格式及其各列的含义(时间戳、大小、对象键、通用前缀)。
  • 如何使用 --recursive 选项递归列出所有子目录中的对象。
  • 如何使用 --versions 选项列出对象的不同版本和删除标记。
  • 如何利用 grep, sort, awk, wc 等标准命令行工具对 ls 命令的输出进行过滤、排序、统计和分析,实现更强大的功能。
  • 在处理大型存储桶时需要考虑的性能问题和最佳实践。
  • aws s3 lsaws s3api list-objects-v2 之间的主要区别。

掌握 aws s3 ls 命令及其与管道工具的结合使用,将极大地提高您在命令行环境下管理 S3 资源的效率和灵活性。请务必在实际操作中多加练习,以便熟练运用这些技巧。

希望这篇详细的教程能够帮助您充分理解和使用 aws s3 ls 命令。如果您有更深入的问题或需要更多高级用法,可以查阅 AWS CLI 的官方文档,它是最权威的参考资料。

祝您在 AWS S3 的世界里操作顺利!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部