我如何在Ruby中执行相同的's3cmd ls s3:// some_bucket / foo / bar'?
我找到了适用于Ruby的Amazon S3 gem以及正确的AWS S3库,但不知何故,如何在S3'文件夹之类的位置上执行简单的'ls'之类命令并不是很明显。
答案 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/')