需要导出Amazon S3服务器中每个文件的path/url
Need to export the path/url of each file in Amazon S3 server
我有一个装有多个存储桶的 Amazon S3 服务器,每个存储桶包含多个子文件夹。总共有 50,000 个文件。我需要生成一个 excel sheet,其中包含每个存储桶中每个文件的 path/url。
例如,如果我有一个名为 b1 的存储桶,它有一个名为 f1.txt 的文件,我希望能够将 f1 的路径导出为 b1/f1.txt。
这需要对 50,000 个文件中的每一个进行。
我曾尝试使用 Expandrive 和 Cyberduck 等 S3 浏览器,但是它们要求您 select 每个文件都复制它们的 URL。
我还尝试在 python 中探索 boto3 库,但是我没有遇到任何内置函数来获取文件 url。
我正在寻找可以使用的任何工具,甚至是可以执行以获取所有 URL 的脚本。谢谢
Amazon s3 库存可以帮助您处理此用例。
请评估该选项。参考:https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html
您可以访问 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
(“阅读”只是为了去除无趣的列)。
nb 我正在使用 v1 CLI。
您应该做的是再次查看 boto3 文档,因为它正是您要查找的内容。按照您的要求进行操作相当简单,但如果您是新手,可能需要阅读一些内容。由于涉及多个步骤,我将尝试引导您朝着正确的方向前进。
在 S3 的 boto3 中,您正在寻找的方法是 list_objects_v2()
。这将为您提供每个对象的 'Key' 或对象路径。您会注意到它将 return 每个对象的整个 json blob。由于您只对密钥感兴趣,因此您可以像在字典中访问 Key/Values 一样定位它。例如。 list_objects_v2()['Contents'][0]['Key']
应该 return 只有第一个对象的对象路径。
如果你已经做到了,下一步就是尝试循环并获取所有值。您可以使用 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?
基本上它的工作方式是只能 returned 1000 个对象。为了克服这个问题,我们使用了一个分页器,它允许您 return 整个结果并将 1000 的限制视为分页,因此您只需要在 for 循环中也使用它来获得您正在寻找的所有结果。
一旦你为一个桶工作,将结果存储在一个列表类型的变量中,并为其余的桶重复。获得所有这些数据后,您可以轻松地将其复制粘贴到 excel sheet 或使用 python 来完成。 (尚未测试代码片段,但它们应该可以工作)。
我有一个装有多个存储桶的 Amazon S3 服务器,每个存储桶包含多个子文件夹。总共有 50,000 个文件。我需要生成一个 excel sheet,其中包含每个存储桶中每个文件的 path/url。
例如,如果我有一个名为 b1 的存储桶,它有一个名为 f1.txt 的文件,我希望能够将 f1 的路径导出为 b1/f1.txt。 这需要对 50,000 个文件中的每一个进行。
我曾尝试使用 Expandrive 和 Cyberduck 等 S3 浏览器,但是它们要求您 select 每个文件都复制它们的 URL。 我还尝试在 python 中探索 boto3 库,但是我没有遇到任何内置函数来获取文件 url。
我正在寻找可以使用的任何工具,甚至是可以执行以获取所有 URL 的脚本。谢谢
Amazon s3 库存可以帮助您处理此用例。 请评估该选项。参考:https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html
您可以访问 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
(“阅读”只是为了去除无趣的列)。
nb 我正在使用 v1 CLI。
您应该做的是再次查看 boto3 文档,因为它正是您要查找的内容。按照您的要求进行操作相当简单,但如果您是新手,可能需要阅读一些内容。由于涉及多个步骤,我将尝试引导您朝着正确的方向前进。
在 S3 的 boto3 中,您正在寻找的方法是 list_objects_v2()
。这将为您提供每个对象的 'Key' 或对象路径。您会注意到它将 return 每个对象的整个 json blob。由于您只对密钥感兴趣,因此您可以像在字典中访问 Key/Values 一样定位它。例如。 list_objects_v2()['Contents'][0]['Key']
应该 return 只有第一个对象的对象路径。
如果你已经做到了,下一步就是尝试循环并获取所有值。您可以使用 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?
基本上它的工作方式是只能 returned 1000 个对象。为了克服这个问题,我们使用了一个分页器,它允许您 return 整个结果并将 1000 的限制视为分页,因此您只需要在 for 循环中也使用它来获得您正在寻找的所有结果。
一旦你为一个桶工作,将结果存储在一个列表类型的变量中,并为其余的桶重复。获得所有这些数据后,您可以轻松地将其复制粘贴到 excel sheet 或使用 python 来完成。 (尚未测试代码片段,但它们应该可以工作)。