微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要导出 Amazon S3 服务器中每个文件的路径/url

如何解决需要导出 Amazon S3 服务器中每个文件的路径/url

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

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

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

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

解决方法

您是否可以访问 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' 只是为了去掉无趣的列)。

nb 我使用的是 v1 CLI。

,

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

,

您应该做的是再次查看 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 多个对象,因此您需要使用分页器来执行此操作。看看这个就明白了。 How to get more than 1000 objects from S3 by using list_objects_v2?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。