2011-01-31 42 views

回答

1

官方Ruby的AWS SDK現在支持這一點:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Tree.html

您還可以添加以下簡便方法:

class AWS::S3::Bucket 
    def ls(path) 
    as_tree(:prefix => path).children.select(&:branch?).map(&:prefix) 
    end 
end 

然後使用它是這樣的:

mybucket.ls 'foo/bar' # => ["/foo/bar/dir1/", "/foo/bar/dir2/"] 
7

使用aws寶石本應該做的伎倆:

s3 = Aws::S3.new(YOUR_ID, YOUR_SECTRET_KEY) 
bucket = s3.bucket('some_bucket') 
bucket.keys('prefix' => 'foo/bar') 
+2

這將遞歸地返回所有密鑰。命令's3cmd ls s3:// some_bucket/foo/bar'僅列出文件夾'bar'中的結果(即使文件夾在S3上並不存在)。 – Erik 2011-02-04 13:02:08

+0

顯然,您需要在AWS-SDK中使用分隔符支持才能模擬's3cmd ls'。看來,目前這是不可能的。 – Erik 2013-01-15 15:18:23

4

我發現了一個類似的問題在這裏:Listing directories at a given level in Amazon S3

此基礎上我創造儘可能多的行爲如同「s3cmd LS的方法<路徑>「:

require 'right_aws' 

module RightAws 
    class S3 
    class Bucket 
     def list(prefix, delimiter = '/') 
     list = [] 
     @s3.interface.incrementally_list_bucket(@name, {'prefix' => prefix, 'delimiter' => delimiter}) do |item| 
      if item[:contents].empty? 
      list << item[:common_prefixes] 
      else 
      list << item[:contents].map{|n| n[:key]} 
      end 
     end 
     list.flatten 
     end 
    end 
    end 
end 

s3 = RightAws::S3.new(ID, SECRET_KEY) 
bucket = s3.bucket('some_bucket') 

puts bucket.list('foo/bar/').inspect 
+1

它現在也可以使用官方紅寶石AWS-SDK有「s3cmd LS」一樣的功能:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Tree.html – Erik 2013-06-26 14:27:31

0

一個快速和簡單的方法使用Ruby AWS列出的水桶文件夾中的文件-sdk:

require 'aws-sdk' 

    s3 = AWS::S3.new 
    your_bucket = s3.buckets['bucket_o_files'] 
    your_bucket.objects.with_prefix('lots/of/files/in/2014/09/03/').each do |file| 
    puts file.key 
    end 

注意在關鍵字末尾的'/',這很重要。

0

我喜歡打開剷鬥類和添加一個「ls」的方法的思想。 我會做這樣的...

class AWS::S3::Bucket 
    def ls(path) 
    objects.with_prefix("#{path}").as_tree.children.select(&:leaf?).collect(&:member).collect(&:key) 
    end 
end 

s3 = AWS::S3.new 
your_bucket = s3.buckets['bucket_o_files'] 
your_bucket.ls('lots/of/files/in/2014/09/03/') 
2

在某些情況下,看起來對這個問題的答案爲AWS-SDK版本2,你可以很容易做這這樣:

creds = Aws::SharedCredentials.new(profile_name: 'my_credentials') 

s3_client = Aws::S3::Client.new(region: 'us-east-1', 
           credentials: creds) 

response = s3_client.list_objects(bucket: "mybucket", 
            delimiter: "/") 

現在,如果你這樣做

response.common_prefixes 

它會給你的那個特定子目錄的「文件夾」,如果你這樣做

response.contents 

它將具有該特定目錄的文件