Быстрый способ перечислить все файлы в корзине Amazon S3?


151

У меня есть амазонка S3, в которой десятки тысяч имен файлов. Какой самый простой способ получить текстовый файл, в котором перечислены все имена файлов в корзине?


Как отмечается в комментарии jldupont к ответу, предоставленному vdaubry, boto.s3.bucketlistresultset.BucketListResultSetобращается к условию «десятки тысяч имен файлов», упомянутому в вопросе.
2013 г.

1
Имейте в виду, что для блоков с очень большим количеством объектов, скажем, миллионов или миллиардов, приведенные ниже подходы к кодированию / написанию сценариев не будут работать хорошо. Вместо этого следует включить инвентаризацию S3 и получить отчет об инвентаризации.
Джермод

Ответы:


120

Я бы порекомендовал использовать Бото . Тогда это пара строк Python :

from boto.s3.connection import S3Connection

conn = S3Connection('access-key','secret-access-key')
bucket = conn.get_bucket('bucket')
for key in bucket.list():
    print key.name.encode('utf-8')

Сохраните это как list.py, откройте терминал, а затем запустите:

$ python list.py > results.txt

3
Если вы получаете: boto.exception.S3ResponseError: S3ResponseError: 403 Запрещено Убедитесь, что политика пользователя для ключа доступа / секретного ключа имеет доступ к S3.
topherjaynes

1
Я получил ошибку 403, и мне пришлось следовать этой инструкции, чтобы заставить ее работать: stackoverflow.com/a/22462419/1143558
Любиза Ливак

как вы проходите через это в bash?
SuperUberDuper

4
Не могли бы вы добавить вариант к этому, используя новый пакет boto3?
yeliabsalohcin

@yeliabsalohcin см. мой ответ
Кейси

62

AWS CLI

Документация для aws s3 ls

AWS недавно выпустила свои инструменты командной строки. Это работает так же, как Бото и может быть установлен с помощью sudo easy_install awscliилиsudo pip install awscli

После установки вы можете просто запустить

aws s3 ls

Который покажет вам все ваши доступные ведра

CreationTime Bucket
       ------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2

Затем вы можете запросить определенное ведро для файлов.

Команда :

aws s3 ls s3://mybucket

Выход :

Bucket: mybucket
Prefix:

      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE somePrefix/
2013-07-25 17:06:27         88 test.txt

Это покажет вам все ваши файлы.


14
Добавьте --recursiveфлаг, чтобы увидеть все объекты в указанном каталоге
Крис Блум

2
Есть ли способ разобрать имена? Я ищу, чтобы сделать список файлов в корзине s3 для перечисления.
Кейси

Кроме того, s3 кодирует имена файлов, которые будут использоваться в качестве URL-адресов, это просто необработанные имена файлов.
Кейси,

42

s3cmd неоценим для такого рода вещей

$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket


1
s3cmdвозвращает имена файлов, отсортированные по дате. Можно ли как-нибудь вернуть его, скажем, только те файлы, которые были добавлены после 2015-10-23 20:46?
SexyBeast

Обратите внимание, что если в именах файлов есть пробелы, у этого есть небольшая ошибка, но у меня нет awk-foo, чтобы это исправить
Colin D

36

Будьте осторожны, список Amazon возвращает только 1000 файлов. Если вы хотите перебрать все файлы, вы должны разбить результаты на страницы с помощью маркеров:

В рубине используя aws-s3

bucket_name = 'yourBucket'
marker = ""

AWS::S3::Base.establish_connection!(
  :access_key_id => 'your_access_key_id',
  :secret_access_key => 'your_secret_access_key'
)

loop do
  objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000)
  break if objects.size == 0
  marker = objects.last.key

  objects.each do |obj|
      puts "#{obj.key}"
  end
end

конец

Надеюсь, это поможет, Винсент


7
boto обрабатывает пейджинг, см. github.com/boto/boto/blob/develop/boto/s3/bucket.py
jldupont

Спасибо за это, мне было трудно найти, как установить маркер: 1:
Адриан Магдас

20

Обновление 15-02-2019:

Эта команда выдаст вам список всех сегментов в AWS S3:

aws s3 ls

Эта команда предоставит вам список всех объектов верхнего уровня внутри корзины AWS S3:

aws s3 ls bucket-name

Эта команда выдаст вам список ВСЕХ объектов внутри корзины AWS S3:

aws s3 ls bucket-name --recursive

Эта команда поместит список ALL в корзину AWS S3 ... в текстовый файл в вашем текущем каталоге:

aws s3 ls bucket-name --recursive | cat >> file-name.txt


Это работает, но не совсем то, что мне нужно. Он просто перечисляет все префиксы «верхнего уровня». Есть ли способ получить все объекты в ведре, префиксы и все?
Риного

Обновление: ответ @sysuser - то, что мне было нужно.
Риного

@rinogo Это не соответствует вашим потребностям, может быть ... но это работает, и это то, что имеет значение здесь. Это соответствует потребностям других людей в качестве правильного ответа.
Халил Гарбауи

Как я уже сказал, это работает - спасибо! Но это не отвечает на вопрос ОП. ОП попросил способ «[перечислить] все имена файлов в корзине». Здесь перечислены только объекты верхнего уровня, а не все объекты.
Риного

2
Ага но это не сложно сделать. Просто добавьте «--recursive» в команду. Я добавлю это в свой ответ, спасибо за указание на это
Халил Гарбауи

12

Для разработчиков Scala здесь это рекурсивная функция для выполнения полного сканирования и отображения содержимого корзины AmazonS3 с использованием официального пакета AWS SDK для Java.

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {

  def scan(acc:List[T], listing:ObjectListing): List[T] = {
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
    val mapped = (for (summary <- summaries) yield f(summary)).toList

    if (!listing.isTruncated) mapped.toList
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
  }

  scan(List(), s3.listObjects(bucket, prefix))
}

Чтобы вызвать вышеупомянутую map()функцию карри , просто передайте уже созданный (и правильно инициализированный) объект AmazonS3Client (см. Официальный AWS SDK для Java API Reference ), имя корзины и имя префикса в первом списке параметров. Также передайте функцию, которую f()вы хотите применить для сопоставления каждой сводки объекта во втором списке параметров.

Например

val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))

вернет полный список (key, owner)кортежей в этом сегменте / префиксе

или

map(s3, "bucket", "prefix")(s => println(s))

как вы обычно подходите к монадам в функциональном программировании


Есть ошибка с этим кодом. Если начальное сканирование урезано, окончательное возвращение вернется только mapped.toListбез какого-либо из предыдущихacc
Марк Ван

Спасибо - обратите внимание, что теперь AmazonS3Client должен быть только AmazonS3.
Энтони Холланд

11

Есть несколько способов сделать это. Использование Python

import boto3

sesssion = boto3.Session(aws_access_key_id, aws_secret_access_key)

s3 = sesssion.resource('s3')

bucketName = 'testbucket133'
bucket = s3.Bucket(bucketName)

for obj in bucket.objects.all():
    print(obj.key)

Другой способ - использовать для этого AWS cli

aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133

если aws уже настроен, строки 2 и 3 можно заменить наs3 = boto3.resource('s3')
sinapan

Если у вас есть переменные окружения, вам не нужно использовать переменные в sessionметоде. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Флавио

7

После zach я бы тоже порекомендовал boto , но мне нужно было немного изменить его код:

conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
    print key.name

3
Модификация была необходима, потому что оригинальный код не работал одновременно.
Datageek

1
conn.lookupвозвращается Noneвместо того, чтобы S3ResponseError(NoSuchBucket)
выдать


5

Для boto3 Python после использования aws configure:

import boto3
s3 = boto3.resource('s3')

bucket = s3.Bucket('name')
for obj in bucket.objects.all():
    print(obj.key)

5

Сначала убедитесь , что вы находитесь на instance terminalи у вас есть all accessиз S3в IAMиспользовании. Например, я использовал экземпляр ec2.

pip3 install awscli

Затем настройте AWS

aws configure

Затем заполните документы ex: -

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json (or just press enter)

Теперь смотрите все ведра

aws s3 ls

Хранить все ведра имя

aws s3 ls > output.txt

Посмотреть всю структуру файлов в ведре

aws s3 ls bucket-name --recursive

Хранить файловую структуру в каждом сегменте

aws s3 ls bucket-name --recursive > file_Structure.txt

Надеюсь это поможет.


работает ... но требует, чтобы получить все ведро
gvasquez

4

AWS CLI позволяет быстро просматривать все файлы корзины S3 и помогает выполнять другие операции.

Чтобы использовать AWS CLI, выполните следующие действия:

  1. Установите AWS CLI.
  2. Настройте интерфейс командной строки AWS для использования учетных данных безопасности по умолчанию и региона AWS по умолчанию.
  3. Чтобы увидеть все файлы корзины S3, используйте команду

    aws s3 ls s3: // your_bucket_name --recursive

Ссылка на использование AWS cli для различных сервисов AWS: https://docs.aws.amazon.com/cli/latest/reference/


3

В Java вы можете получить ключи, используя ListObjects (см. Документацию AWS )

FileWriter fileWriter;
BufferedWriter bufferedWriter;
// [...]

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());        

ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withPrefix("myprefix");
ObjectListing objectListing;

do {
    objectListing = s3client.listObjects(listObjectsRequest);
    for (S3ObjectSummary objectSummary : 
        objectListing.getObjectSummaries()) {
        // write to file with e.g. a bufferedWriter
        bufferedWriter.write(objectSummary.getKey());
    }
    listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());

Доступен еще один простой API, который берет имя корзины и перечисляет объекты, присутствующие в нем. ObjectListing objects = s3client.listObjects (bucketName) Ссылка на Javadoc приведена ниже, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/…
Раджеш,

2

Код на python с использованием потрясающей "boto" lib . Код возвращает список файлов в сегменте, а также обрабатывает исключения для отсутствующих сегментов.

import boto

conn = boto.connect_s3( <ACCESS_KEY>, <SECRET_KEY> )
try:
    bucket = conn.get_bucket( <BUCKET_NAME>, validate = True )
except boto.exception.S3ResponseError, e:
    do_something() # The bucket does not exist, choose how to deal with it or raise the exception

return [ key.name.encode( "utf-8" ) for key in bucket.list() ]

Не забудьте заменить <PLACE_HOLDERS> вашими значениями.


2

Приведенная ниже команда получит все имена файлов из вашей корзины AWS S3 и запишет в текстовый файл в вашем текущем каталоге:

aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt

1

В качестве альтернативы вы можете использовать Minio Client aka mc. Его открытый исходный код и совместим с AWS S3. Он доступен для Linux, Windows, Mac, FreeBSD.

Все, что вам нужно сделать, это запустить команду mc ls для просмотра содержимого.

$ mc ls s3 / kline /
[2016-04-30 13:20:47 IST] 1.1MiB 1.jpg
[2016-04-30 16:03:55 IST] 7.5KiB docker.png
[2016-04-30 15:16:17 IST] 50 КБ pi.png
[2016-05-10 14:34:39 IST] 365 КБ upton.pdf

Примечание:

  • s3: псевдоним для Amazon S3
  • kline: название корзины AWS S3

Установка Minio Client Linux Скачать mc для:

$ chmod 755 мс
$ ./mc --help

Настройка учетных данных AWS с помощью клиента Minio

$ mc config host add mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

Примечание. Пожалуйста, замените mys3 псевдонимом, который вы хотели бы использовать для этой учетной записи, и BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 на AWS ACCESS-KEY и SECRET-KEY.

Надеюсь, поможет.

Отказ от ответственности: я работаю на Minio


Пожалуйста, не делитесь секретным ключом IAM где-либо.
Алексей Важнов

1

Вы можете использовать стандартный API S3 -

aws s3 ls s3://root/folder1/folder2/

1

Вы можете перечислить все файлы в ведре aws s3, используя команду

aws s3 ls path/to/file

и чтобы сохранить его в файле, используйте

aws s3 ls path/to/file >> save_result.txt

если вы хотите добавить свой результат в файл иначе:

aws s3 ls path/to/file > save_result.txt

если вы хотите очистить то, что было написано ранее.

Это будет работать как в Windows, так и в Linux.


1

В JavaScript вы можете использовать

s3.listObjects (params, function (err, result) {});

чтобы получить все объекты внутри ведра. Вы должны передать имя корзины внутри параметров (Bucket: name) .


1
function showUploads(){
    if (!class_exists('S3')) require_once 'S3.php';
    // AWS access info
    if (!defined('awsAccessKey')) define('awsAccessKey', '234567665464tg');
    if (!defined('awsSecretKey')) define('awsSecretKey', 'dfshgfhfghdgfhrt463457');
    $bucketName = 'my_bucket1234';
    $s3 = new S3(awsAccessKey, awsSecretKey);
    $contents = $s3->getBucket($bucketName);
    echo "<hr/>List of Files in bucket : {$bucketName} <hr/>";
    $n = 1;
    foreach ($contents as $p => $v):
        echo $p."<br/>";
        $n++;
    endforeach;
}

1
Какой класс S3 вы используете? Где я могу получить это?
iDev247

0
# find like file listing for s3 files
aws s3api --profile <<profile-name>> \
--endpoint-url=<<end-point-url>> list-objects \
--bucket <<bucket-name>> --query 'Contents[].{Key: Key}'

3
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
Тоби Спейт

0

Упрощенная и обновленная версия ответа Scala от Paolo:

import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.model.{ListObjectsRequest, ObjectListing, S3ObjectSummary}

def buildListing(s3: AmazonS3, request: ListObjectsRequest): List[S3ObjectSummary] = {
  def buildList(listIn: List[S3ObjectSummary], bucketList:ObjectListing): List[S3ObjectSummary] = {
    val latestList: List[S3ObjectSummary] = bucketList.getObjectSummaries.toList

    if (!bucketList.isTruncated) listIn ::: latestList
    else buildList(listIn ::: latestList, s3.listNextBatchOfObjects(bucketList))
  }

  buildList(List(), s3.listObjects(request))
}

Удаление обобщенных элементов и использование ListObjectRequest, созданного строителями SDK.


0
public static Dictionary<string, DateTime> ListBucketsByCreationDate(string AccessKey, string SecretKey)  
{  

    return AWSClientFactory.CreateAmazonS3Client(AccessKey,
        SecretKey).ListBuckets().Buckets.ToDictionary(s3Bucket => s3Bucket.BucketName,
        s3Bucket => DateTime.Parse(s3Bucket.CreationDate));

}

2
Я предполагаю, что это прототип Java или что-то еще, но, пожалуйста, объясните это.
Дончо Ганчев

0

В PHP вы можете получить полный список объектов AWS-S3 внутри определенного сегмента, используя следующий вызов

$S3 = \Aws\S3\S3Client::factory(array('region' => $region,));
$iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($iterator as $obj) {
    echo $obj['Key'];
}

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


0

Используйте plumbum, чтобы обернуть cli, и у вас будет четкий синтаксис:

import plumbum as pb
folders = pb.local['aws']('s3', 'ls')

0

пожалуйста, попробуйте этот скрипт bash. он использует команду curl без каких-либо внешних зависимостей

bucket=<bucket_name>
region=<region_name>
awsAccess=<access_key>
awsSecret=<secret_key>
awsRegion="${region}"
baseUrl="s3.${awsRegion}.amazonaws.com"

m_sed() {
  if which gsed > /dev/null 2>&1; then
    gsed "$@"
  else
    sed "$@"
  fi
}

awsStringSign4() {
  kSecret="AWS4$1"
  kDate=$(printf         '%s' "$2" | openssl dgst -sha256 -hex -mac HMAC -macopt "key:${kSecret}"     2>/dev/null | m_sed 's/^.* //')
  kRegion=$(printf       '%s' "$3" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kDate}"    2>/dev/null | m_sed 's/^.* //')
  kService=$(printf      '%s' "$4" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kRegion}"  2>/dev/null | m_sed 's/^.* //')
  kSigning=$(printf 'aws4_request' | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kService}" 2>/dev/null | m_sed 's/^.* //')
  signedString=$(printf  '%s' "$5" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kSigning}" 2>/dev/null | m_sed 's/^.* //')
  printf '%s' "${signedString}"
}

if [ -z "${region}" ]; then
  region="${awsRegion}"
fi


# Initialize helper variables

authType='AWS4-HMAC-SHA256'
service="s3"
dateValueS=$(date -u +'%Y%m%d')
dateValueL=$(date -u +'%Y%m%dT%H%M%SZ')

# 0. Hash the file to be uploaded

# 1. Create canonical request

# NOTE: order significant in ${signedHeaders} and ${canonicalRequest}

signedHeaders='host;x-amz-content-sha256;x-amz-date'

canonicalRequest="\
GET
/

host:${bucket}.s3.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:${dateValueL}

${signedHeaders}
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

# Hash it

canonicalRequestHash=$(printf '%s' "${canonicalRequest}" | openssl dgst -sha256 -hex 2>/dev/null | m_sed 's/^.* //')

# 2. Create string to sign

stringToSign="\
${authType}
${dateValueL}
${dateValueS}/${region}/${service}/aws4_request
${canonicalRequestHash}"

# 3. Sign the string

signature=$(awsStringSign4 "${awsSecret}" "${dateValueS}" "${region}" "${service}" "${stringToSign}")

# Upload

curl -g -k "https://${baseUrl}/${bucket}" \
  -H "x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \
  -H "x-amz-Date: ${dateValueL}" \
  -H "Authorization: ${authType} Credential=${awsAccess}/${dateValueS}/${region}/${service}/aws4_request,SignedHeaders=${signedHeaders},Signature=${signature}"

-2

Самый простой способ получить очень удобный текстовый файл - это загрузить S3 Browser http://s3browser.com/ и использовать Генератор веб-URL для получения списка полных путей ссылки. Это очень удобно и занимает около 3 кликов.

-Browse to Folder
-Select All
-Generate Urls

Удачи вам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.