我該怎麼做的 's3cmd LS S3:// some_bucket /富/酒吧' 相當於Ruby的?如何在Ruby中做's3cmd ls s3:// some_bucket/foo/bar'的等價物?
我發現Ruby的Amazon S3的寶石,也是正確AWS S3庫,但不知何故,它不會立即明顯如何像位置上的S3「文件夾」做一個簡單的「ls」的類似命令。
我該怎麼做的 's3cmd LS S3:// some_bucket /富/酒吧' 相當於Ruby的?如何在Ruby中做's3cmd ls s3:// some_bucket/foo/bar'的等價物?
我發現Ruby的Amazon S3的寶石,也是正確AWS S3庫,但不知何故,它不會立即明顯如何像位置上的S3「文件夾」做一個簡單的「ls」的類似命令。
官方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/"]
使用aws
寶石本應該做的伎倆:
s3 = Aws::S3.new(YOUR_ID, YOUR_SECTRET_KEY)
bucket = s3.bucket('some_bucket')
bucket.keys('prefix' => 'foo/bar')
我發現了一個類似的問題在這裏: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
它現在也可以使用官方紅寶石AWS-SDK有「s3cmd LS」一樣的功能:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Tree.html – Erik 2013-06-26 14:27:31
一個快速和簡單的方法使用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
注意在關鍵字末尾的'/',這很重要。
我喜歡打開剷鬥類和添加一個「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/')
在某些情況下,看起來對這個問題的答案爲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
它將具有該特定目錄的文件
這將遞歸地返回所有密鑰。命令's3cmd ls s3:// some_bucket/foo/bar'僅列出文件夾'bar'中的結果(即使文件夾在S3上並不存在)。 – Erik 2011-02-04 13:02:08
顯然,您需要在AWS-SDK中使用分隔符支持才能模擬's3cmd ls'。看來,目前這是不可能的。 – Erik 2013-01-15 15:18:23