Mar*_*tan 4 ruby directory amazon-s3
我在亚马逊S3桶中存储了200万个文件.下面有一个给定的根(l1),l1下的目录列表,然后每个目录包含文件.所以我的桶看起来像下面这样
l1/a1/file1-1.jpg
l1/a1/file1-2.jpg
l1/a1/... another 500 files
l1/a2/file2-1.jpg
l1/a2/file2-2.jpg
l1/a2/... another 500 files
....
l1/a5000/file5000-1.jpg
Run Code Online (Sandbox Code Playgroud)
我想尽快列出二级条目,所以我想得到a1,a2,a5000.我不想列出所有的密钥,这将花费更长的时间.
我很乐意直接使用AWS api,但是到目前为止我已经使用ruby中的right_aws gem玩了http://rdoc.info/projects/rightscale/right_aws
该gem中至少有两个API,我尝试在S3模块中使用bucket.keys(),在S3Interface模块中使用incrementally_list_bucket().例如,我可以设置前缀和分隔符列出所有l1/a1/*,但我无法弄清楚如何仅列出l1中的第一级.在incrementally_list_bucket()返回的哈希中有一个:common_prefixes条目,但在我的测试样本中没有填写.
S3 API可以实现此操作吗?
谢谢!
right_aws
允许这样做作为其基础S3Interface
类的一部分,但您可以创建自己的方法,以便更容易(和更好)的使用.把它放在代码的顶部:
module RightAws
class S3
class Bucket
def common_prefixes(prefix, delimiter = '/')
common_prefixes = []
@s3.interface.incrementally_list_bucket(@name, { 'prefix' => prefix, 'delimiter' => delimiter }) do |thislist|
common_prefixes += thislist[:common_prefixes]
end
common_prefixes
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
这会将common_prefixes
方法添加到RightAws::S3::Bucket
类中.现在,mybucket.keys
您可以使用mybucket.common_prefixes
获取一组公共前缀,而不是调用来获取存储桶中的键列表.在你的情况下:
mybucket.common_prefixes("l1/")
# => ["l1/a1", "l1/a2", ... "l1/a5000"]
Run Code Online (Sandbox Code Playgroud)
我必须说我只用少量公共前缀测试它; 你应该检查这是否适用于超过1000个公共前缀.
归档时间: |
|
查看次数: |
5852 次 |
最近记录: |