我正在尝试获取 S3 存储桶中前缀下的单级对象。存储桶中有大量对象,因此我想迭代特定前缀下的每个文件夹。到目前为止,这是我的代码:
require 'aws-sdk'
region = 'us-west-1'
bucket_name = 'my-example-bucket'
prefix = 'test1'
delimiter = '/'
s3_client = Aws::S3::Client.new(region: region)
resp = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: prefix + delimiter)
obj_list = []
resp.contents.each do |c|
p c
break
end
当我运行此命令时,我得到一个位于我的前缀内部 4 层深处的单个对象。
该前缀下有243个文件夹。我只想要这243,别无其他。
我该怎么做?
首先您应该使用 prefix='test1/' 和 delimiter='/'。
但是您将得不到任何内容。 S3 中的文件夹只是另一个前缀,因此您可以做的就是迭代前缀。
region = 'us-west-1'
bucket_name = 'my-example-bucket'
prefix = 'test1/'
objs = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: '/')
objs.common_prefixes.map(&:prefix).each do |prefix|
current_objs = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: '/')
p current_objs.contents # you will get nothing here again if all you have inside the folders is some other folders
end
如果我正确理解你的问题,你想要的只是前缀
test1
下的“文件夹”名称的集合。
bucket_name = "my-example-bucket"
prefix = "test1/"
delimiter = "/"
object_list = S3_CLIENT.list_objects(bucket: bucket_name, prefix: prefix, delimiter: delimiter)
object_list.common_prefixes.each_with_object([]) do |common_prefix, memo|
# match the prefix one level under our desired prefix while filtering out files at that level
next unless match_prefix = common_prefix.prefix.match(/#{prefix}\/(.+)\//)[1]
# Skip it if we already have collected that prefix
next if memo.includes?(match_prefix)
memo << match_prefix
end