Как сделать эквивалент 's3cmd ls s3: // some_bucket / foo / bar' в Ruby? - PullRequest
3 голосов
/ 31 января 2011

Как мне сделать эквивалент 's3cmd ls s3: // some_bucket / foo / bar' в Ruby?

Я нашел гем Amazon S3 для Ruby, а также библиотеку Right AWS S3, но почему-то не сразу понятно, как выполнить простую команду типа «ls» в расположении, похожем на «папку» S3.

Ответы [ 6 ]

7 голосов
/ 31 января 2011

Используя драгоценный камень aws, это поможет:

s3 = Aws::S3.new(YOUR_ID, YOUR_SECTRET_KEY)
bucket = s3.bucket('some_bucket')
bucket.keys('prefix' => 'foo/bar')
4 голосов
/ 04 февраля 2011

Я нашел похожий вопрос здесь: Список каталогов на заданном уровне в 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
2 голосов
/ 03 декабря 2015

Если кто-то ищет ответ на этот вопрос для 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

У него будут файлы этого конкретного каталога

1 голос
/ 26 июня 2013

Официальный 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/"]
0 голосов
/ 08 сентября 2014

Мне нравится идея открытия класса 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/')
0 голосов
/ 08 сентября 2014

быстрый и простой способ вывести список файлов в папке корзины, используя 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

Обратите внимание на '/' в конце ключа, это важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...