1

我有一个 aws 存储桶对象(图像)列表,我可以像这样迭代它们:

S3.buckets[ENV['AWS_BUCKET']].objects.each do |o| puts o.inspect end

所以这会打印出类似的列表:

<AWS::S3::S3Object:dss-dev/photos/_097719-10201008011674296-351330164-o.jpg>

如何过滤包含特定字符串的文件?

我试过这个:

S3.buckets[ENV['AWS_BUCKET']].objects.each do |o| puts o.name end

但我收到了这个错误:

NoMethodError: undefined method `name' for #<AWS::S3::S3Object:0x00000009273798>

从 aws API 我尝试了一些方法,例如名称、url

http://amazon.rubyforge.org/doc/classes/AWS/S3/S3Object.html

如果我尝试搜索,有没有办法在特定存储桶中搜索部分名称,097719如果它只是该文件名的一部分:

<AWS::S3::S3Object:dss-dev/photos/_097719-10201008011674296-351330164-o.jpg>

还是遍历整个文件列表并访问文件名并比较名称与搜索字符串?

4

3 回答 3

2

There is no 'name' attribute on S3Object, you may want to use the 'key' attribute

S3.buckets[ENV['AWS_BUCKET']].objects.select do |s3_object|
    s3_object.key.include? '097719'
end

This should give you all S3 Objects with a key that include '097719'

Hope this helps

于 2013-10-23T09:34:07.627 回答
0

此外,在 S3 中,文件夹的表示方式与它们在普通文件系统中的方式不同。您可以将每个 s3 存储桶视为一个大的 hashMap,其中文件的完整路径是键,值是文件的内容。一旦您在存储桶中(例如 s3.bucket['my_bucket']),文件所在的文件夹只是一个键前缀。因此,如果您想在 my_bucket/photos/ 文件夹中的对象中进行搜索,您可以执行以下操作:

s3.buckets['my_bucket'].objects.with_prefix('photos/').select { |obj| obj.key =~ /097719/}

这可以大大减少您查看的文件数量。如果您知道文件名(s3 术语中的对象键)将以特定的前缀字符串开头(例如 _097719),您也可以将其附加到前缀上:

bucket.objects.with_prefix("photos/_097719").select { |obj| 
        obj.key =~ Regexp.new(search_string)}

希望这可以大大加快您的搜索速度!

于 2013-10-23T21:56:29.060 回答
0

看起来在最近的 SDK 版本中 TravisG 的答案应该可以工作,如果你稍微修改一下:

bucket.objects(prefix: "photos/_097719").select { |obj| 
        obj.key =~ Regexp.new(search_string)}
于 2016-03-01T21:17:50.173 回答