-1

我有一个装有多个存储桶的 Amazon S3 服务器,每个存储桶包含多个子文件夹。总共有 50,000 个文件。我需要生成一个 excel 表,其中包含每个存储桶中每个文件的路径/url。

例如,如果我有一个名为 b1 的存储桶,并且它有一个名为 f1.txt 的文件,我希望能够将 f1 的路径导出为 b1/f1.txt。这需要对 50,000 个文件中的每一个文件执行此操作。

我曾尝试使用像 Expandrive 和 Cyber​​duck 这样的 S3 浏览器,但是它们要求您选择每个文件来复制它们的 url。我还尝试在 python 中探索 boto3 库,但是我没有遇到任何内置函数来获取文件 url。

我正在寻找我可以使用的任何工具,甚至是我可以执行以获取所有 url 的脚本。谢谢。

4

3 回答 3

1

您可以访问 aws cli 吗?aws s3 ls --recursive {bucket}将列出存储桶中的所有嵌套文件。

例如,这个 bash 命令将列出所有存储桶,然后递归打印每个存储桶中的所有文件:

aws s3 ls | while read x y bucket; do aws s3 ls --recursive $bucket | while read x y z path; do echo $path; done; done

('read's 只是为了去掉无趣的列)。

注意我正在使用 v1 CLI。

于 2021-05-24T15:07:49.357 回答
0

Amazon s3 库存可以帮助您处理此用例。请评估该选项。参考:https ://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html

于 2021-05-24T13:11:07.017 回答
0

您应该做的是再次查看 boto3 文档,因为它是您正在寻找的。做您所要求的事情相当简单,但如果您是新手,可能需要阅读一些内容。由于涉及多个步骤,我将尝试引导您朝着正确的方向前进。

在 S3 的 boto3 中,您正在寻找的方法是list_objects_v2(). 这将为您提供每个对象的“键”或对象路径。您会注意到它将返回每个对象的整个 json blob。由于您只对 Key 感兴趣,因此您可以像访问 dict 中的 Key/Values 一样定位它。例如list_objects_v2()['Contents'][0]['Key'],应该只返回第一个对象的对象路径。

如果你已经做到了,下一步就是尝试循环并获取所有值。您可以使用 for 循环来执行此操作,或者我经常使用一个很棒的 python 包,称为 jmespath - https://jmespath.org/

以下是如何在一行中检索最多 1000 个对象的所有对象路径。

import jmespath
bucket_name='im-a-bucket'
s3_client = boto3.client('s3')
bucket_object_paths = jmespath.search('Contents[*].Key', s3_client.list_objects_v2(Bucket=bucket_name))

现在,由于您的存储桶可能有超过 1000 个对象,因此您需要使用分页器来执行此操作。看看这个就明白了。 如何使用 list_objects_v2 从 S3 获取超过 1000 个对象?

基本上它的工作方式是只能返回 1000 个对象。为了克服这个问题,我们使用了一个分页器,它允许您返回整个结果并将 1000 的限制视为分页,因此您只需要在 for 循环中也使用它来获取您正在寻找的所有结果。

一旦你为一个存储桶工作,将结果存储在一个类型为 list 的变量中,并为其余的存储桶重复。获得所有这些数据后,您可以轻松地将其复制粘贴到 Excel 工作表中或使用 python 来完成。(尚未测试代码片段,但它们应该可以工作)。

于 2021-05-25T12:04:26.570 回答