web-dev-qa-db-ja.com

Ruby on railsでAWS-SDK gemを使用してs3フォルダー内のすべてのファイルをリストする方法

S3フォルダー内のすべてのファイルのリストを表示して、最後に変更されたすべての日付を取得して、どのファイルが変更されたかを判別できるようにしました。

Objects.with_prefix( 'Folder1')を使用してみましたが、完全なリストが表示されますが、Folder1.1キーも含まれています

区切り文字を使用する必要があるかどうかはわかりませんが、aws SDKで区切り文字を使用する方法が見つかりませんでした。

事前に感謝します!

「aws-sdk」gemを使用しています

これが私のバケット構造です-Folder1 -File1 -File2 -Folder.1.1

ここに私のコードがあります

bucket = s3.buckets[bucket_name]
data = bucket.objects.with_prefix('Folder1/')
data.each do |object|
    puts "#{object.key}\t#{object.last_modified}";
end
31
user648198

回答が遅すぎますが、絶対にありません。

できるよ

s3_bucket.objects.with_prefix('folder_name').collect(&:key)

公式文書によると こちら

28
kebomix

この小さなコードを使用して、特定のフォルダーのファイルのリストを取得できます。

 s3 = Aws::S3::Resource.new(region: 'ap-southeast-1', access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'] )
 data_files = s3.bucket(bucket_name).objects(prefix: 'prefix/', delimiter: 'delimiter').collect(&:key)
11
Mohit Jain

https://docs.aws.Amazon.com/sdk-for-Ruby/v3/api/Aws/S3/Client.html#list_objects_v2-instance_method

SDK V3には、クライアント用のプレフィックスオプションがあります!

resp = client.list_objects_v2({ bucket: "BucketName", # required prefix: "FolderName", })

3
ir0x539

現在、私もこの問題に悩まされています。これまでの解決策は、すべてのオブジェクトを取得し、後でフィルタリングすることです。

data = bucket.objects(bucketname, prefix: 'Folder1')

data_without_folders = data.select { |obj| !(obj.key =~ /\/$/) }

区切り文字については、次のようにbucket.objects呼び出しで渡す必要があります。

data = bucket.objects(bucketname, prefix: 'prefix', delimiter: 'delimiter') 

より良い解決策が利用可能であれば、お知らせします。

2