如何在Ruby中执行相当于's3cmd ls s3:// some_bucket / foo / bar'的操作?

时间:2011-01-31 10:43:26

标签: ruby amazon-s3

我如何在Ruby中执行相同的's3cmd ls s3:// some_bucket / foo / bar'?

我找到了适用于Ruby的Amazon S3 gem以及正确的AWS S3库,但不知何故,如何在S3'文件夹之类的位置上执行简单的'ls'之类命令并不是很明显。

6 个答案:

答案 0 :(得分:7)

使用aws gem这应该可以解决问题:

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

答案 1 :(得分:4)

我在这里找到了类似的问题:Listing directories at a given level in Amazon S3

基于此我创建了一个尽可能表现为's3cmd ls< path>'的方法:

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

答案 2 :(得分: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

它将为您提供&#34;文件夹&#34;该特定子目录,如果你这样做

response.contents

它将包含该特定目录的文件

答案 3 :(得分: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/"]

答案 4 :(得分: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

注意密钥末尾的'/',这很重要。

答案 5 :(得分:0)

我喜欢打开Bucket类并添加'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/')