繁体   English   中英

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

[英]Need to export the path/url of each file in Amazon S3 server

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

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

我曾尝试使用像 Expandrive 和 Cyberduck 这样的 S3 浏览器,但是它们要求您对每个文件 select 来复制它们的 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's 只是为了去掉无趣的列)。

注意我正在使用 v1 CLI。

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

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

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

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

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

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 的变量中,并为存储桶的 rest 重复。 获得所有这些数据后,您可以轻松地将其复制粘贴到 excel 工作表中,或使用 python 来完成。 (尚未测试代码片段,但它们应该可以工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM