перечислить все файлы из s3 с помощью aws-sdk gem

У меня такой сценарий. Рассмотрим в моем случае структуру папок aws s3 следующим образом

- videos
  - my_videos
    - college

Я загрузил видеофайл, например myfirst_day.mp4 в college, для этого связанного сформированного ключа "videos/my_videos/college/myfirst_day.mp4"

Теперь мне нужно перечислить все файлы из каталога videos/my_videos/college. Как мне это сделать.

Для этого я использую aws-sdk gem.


person user2622247    schedule 30.04.2014    source источник


Ответы (1)


Вы можете просто перебрать bucket objects и использовать метод with_prefix

s3.buckets[YOUR BUCKET NAME].objects.with_prefix('videos/my_videos/college').each.collect(&:key)
#=> ["videos/my_videos/college/myfirst_day.mp4"]

ИЛИ используйте метод as_tree

s3.buckets[YOUR BUCKET NAME].as_tree(prefix:'videos/my_videos/college').select(&:leaf?).collect(&:key)
 #=> ['videos/my_videos/college/myfirst_day.mp4']

Очевидно, они вымышленные, поскольку у меня нет доступа к вашему ведру, но взгляните на ObjectCollection и Tree, чтобы узнать о других методах в AWSSDK.

Существует довольно много доступных методов обхода корзины, например Tree отвечает на children, в котором будут перечислены как LeafNodes (файл), так и BranchNodes (каталог). BranchNodes тогда также ответит на children, так что вы можете сделать это рекурсивным, если необходимо.

Чтобы получить suffix (например, просто имя файла), вы могли бы исправить их.

class LeafNode
  def suffix
    @member.key.split(delimiter).pop
  end
end
class S3Object
  def suffix
    @key.split("/").pop
  end
end

Я не тестировал их полностью, но они должны работать для возврата только самого имени файла, если он вложен в ветку.

person engineersmnky    schedule 30.04.2014
comment
Я делаю то же самое. Есть ли способ получить просто имя файла, а не весь путь? - person theTuxRacer; 24.06.2014
comment
@theTuxRacer есть метод prefix, но я не вижу метода suffix, хотя это был бы простой патч, я обновил свой ответ для уточнения - person engineersmnky; 24.06.2014
comment
Спасибо, что нашли время ответить на мой вопрос. Вот что я в итоге и сделал :) - person theTuxRacer; 26.06.2014
comment
@theTuxRacer без проблем. Рад, что это работает для вас, похоже, это должно быть частью жемчужины, поскольку я уверен, что вы не единственный пользователь, которому эта функция нужна. - person engineersmnky; 26.06.2014
comment
Привет, @engineersmnky. Я посмотрел на этот ответ, который объясняет, почему мы получаем OP, как и мы. Я впервые прочитал об этом и разместил здесь, предполагая, что вы тоже не знаете: stackoverflow.com/a/20012200 / 174936 Приносим извинения, если это не так. Спасибо. - person theTuxRacer; 03.07.2014
comment
@theTuxRacer не уверен, что понимаю комментарий? list_objects отвечает как Core::Response в формате XML, так что да, вы можете технически использовать это, хотя реализация кажется немного более сложной - person engineersmnky; 03.07.2014