2013-10-23 61 views
1

我已經有了AWS桶對象(圖像)的列表,我可以遍歷他們是這樣的:遍歷AWS S3存儲和過濾

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我試過一些方法,如名稱,網址

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

如果我嘗試搜索,有沒有辦法搜索特定的部分名稱桶?對於097719我得到這個如果只有部分文件名:

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

或者迭代低谷整個文件列表和訪問文件名,並與搜索字符串比較的名字嗎?

+0

有沒有這樣的API看起來。你將不得不遍歷整個列表。 – JunaidKirkire

回答

2

沒有「名」的S3Object屬性,您可能需要使用「鑰匙」屬性

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

這應該給你所有S3與包括「097719」

的關鍵對象希望這可以幫助

0

而且,在S3中,文件夾的表現方式並不像普通文件系統中那樣。您可以將每個s3存儲桶視爲一個大型哈希映射,其中文件的完整路徑是密鑰,值是該文件的內容。一旦你在一個桶中(例如s3.bucket ['my_bucket']),文件所在的文件夾就是一個關鍵的前綴。所以,如果你想在MY_BUCKET /照片/文件夾的對象中進行搜索,你可以這樣做:

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)} 

希望這加快您搜索一下!

0

看起來像recent SDK version TravisG的答案應該上述工作已經修改過稍微:

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