使用Amazon Ruby SDK for S3时,我需要枚举大桶中的所有文件,以识别任何空文件,即obj.content_length == 0
我写了一个脚本来做到这一点:
bucket.objects.each() do |obj|
total_objs += 1
if obj.content_length == 0 then
empty_files += 1
puts obj.key
end
end
...但我担心这会导致每个文件被下载以确定文件大小。 SDK是否实际下载文件以了解大小,或者它是否只是被拉取的元数据,然后如果调用适当的方法则会懒惰地下载对象?
此外,是否有更有效的方法来实现我想要做的事情?
答案 0 :(得分:2)
获得所需内容的最简单方法是使用适用于Ruby的v2 AWS SDK,以aws-sdk-core
形式提供:
require 'aws-sdk-core'
empty_files = 0
s3 = Aws::S3::Client.new
s3.list_objects(bucket:'aws-sdk').each do |resp|
resp.contents.each do |obj|
if obj.content_length == 0
empty_files += 1
puts obj.key
end
end
end
上面的代码每1k对象只发出1个请求(S3仅返回每个响应1k个对象的信息)。它使用SDK的内置客户端响应分页功能,以确保您在使用桶之前一直调用#list_objects。这不会下载对象主体,您可以调用Aws::S3::Client#get_object
来执行此操作。
更新:
v2 SDK现在通过面向资源的界面支持此功能。上面使用aws-sdk-resources
:
require 'aws-sdk' # must be v2 sdk
empty_files = 0
s3 = Aws::S3::Resource.new
s3.bucket('aws-sdk').objects.each do |obj|
if obj.size == 0
empty_files += 1
puts obj.key
end
end