やりたいこと
Fog::AWS を使って、S3 の特定の bucket にある全てのファイルを取得したい。
しかし Fog::AWS::Storage::Directory#files
や Fog::AWS::Storage::Files#all
を使っても 1,000 件のファイルしか取得できない
s3 = Fog::Storage.new(provider: 'AWS', use_iam_profile: true)
directory = s3.directories.get('my-bucket-name')
files = directory.files
files.count
#=> 1000
files = directory.files.all
files.count
#=> 1000
ファイルが 1,000 件より多く存在する場合でも全てのファイルを取得したい。
方法
Fog::AWS::Storage::Files#all
に marker
を渡すことで続きのファイルを取得する。
def find_all_files_in(directory)
Enumerator.new do |y|
marker = nil
loop do
files = directory.files.all(marker: marker)
break if files.none?
files.each_with_index do |file, i|
y << file
# 最後の要素
marker = file.key if i + 1 == files.size
end
end
end
end
files = find_all_files_in(directory)
files = files.to_a
files.size #=> 5432
バージョン情報
Fog::AWS::VERSION
#=> "3.30.0"