S3 Ruby SDK 仅列出直接位于前缀下的对象?

问题描述 投票:0回答:2

我正在尝试获取 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,别无其他。

我该怎么做?

ruby amazon-s3 aws-sdk
2个回答
1
投票

首先您应该使用 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

0
投票

如果我正确理解你的问题,你想要的只是前缀

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
© www.soinside.com 2019 - 2024. All rights reserved.