迭代aws s3桶和过滤器

时间:2013-10-23 07:31:48

标签: ruby-on-rails ruby amazon-web-services amazon-s3

我有一个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我尝试了一些方法,比如name,url

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

如果我尝试搜索097719,是否有办法搜索特定存储区的部分名称,如果它只是该文件名的一部分,我会得到它:

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

或者通过整个文件列表进行迭代并访问文件名并比较名称与搜索字符串?

3 个答案:

答案 0 :(得分:2)

S3Object上没有'name'属性,您可能想要使用'key'属性

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

这应该为您提供包含'097719'

的密钥的所有S3对象

希望这有帮助

答案 1 :(得分: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)}

希望这会加快你的搜索速度!

答案 2 :(得分:0)

recent SDK version中看起来像TravisG上面的答案,如果你稍微修改过它应该有用:

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