Швидкий спосіб перерахувати всі файли у відрі Amazon S3?


151

У мене є відро Amazon s3, в якому є десятки тисяч імен файлів. Який найпростіший спосіб отримати текстовий файл, у якому перераховані всі назви файлів у відрі?


Як згадується коментарем jldupont щодо відповіді, наданої vdaubry, boto.s3.bucketlistresultset.BucketListResultSetстосується умови "десятки тисяч імен", згаданої у запитанні.
чб

1
Майте на увазі, що для відра з дуже великою кількістю об'єктів, скажімо, мільйонів чи мільярдів, підходи до кодування / сценаріїв нижче не будуть працювати добре. Натомість слід включити інвентар S3 та отримати звіт про інвентаризацію.
jarmod

Відповіді:


120

Я рекомендую використовувати boto . Тоді це швидка пара рядків 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 Заборонено Переконайтеся, що політика користувача для ключа Access / Secret має доступ до S3.
topherjaynes

1
Я отримав 403 помилки, і я повинен був слідувати цій інструкції, щоб зробити його роботу: stackoverflow.com/a/22462419/1143558
любиш Livac

як ти прокручуєш його через bash?
SuperUberDuper

4
Чи можете ви додати варіант до цього, використовуючи новий пакет boto3?
yeliabsalohcin

@yeliabsalohcin дивіться мою відповідь
Кейсі

62

AWS CLI

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

AWS нещодавно випустили свої інструменти командного рядка. Це працює так само, як boto, і його можна встановити за допомогою 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прапор, щоб побачити всі об'єкти у вказаному каталозі
Chris Bloom

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

Ця команда розмістить список ВСІХ у відрі AWS S3 ... всередині текстового файлу у вашому поточному каталозі:

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


Це працює, але насправді не те, що мені потрібно. Він просто перераховує всі префікси "найвищого рівня". Чи є спосіб отримати всі об’єкти у відро, префікси та все?
rinogo

Оновлення: відповідь від @sysuser - те, що мені було потрібно.
риного

@rinogo Це, можливо, не відповідає вашим потребам ... але це працює, і ось що враховується. Його відповідність потребам інших ppl як правильна відповідь.
Халил Гарбауї

Як я вже сказав, це працює - дякую! Але це не відповідає на питання ОП. ОП попросив спосіб "[перерахувати] всі назви файлів у відрі". Це лише перелік об'єктів верхнього рівня, не всіх об'єктів.
rinogo

2
Ага, але це не важко зробити. Просто додайте до команди "--рекурсивний". Я додам його до своєї відповіді спасибі за те, що наголосив на цьому
Халил Гарбауї

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

Потім заповніть додаткові оцінки:

$ 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 CLI для використання облікових даних за замовчуванням та регіону AWS за замовчуванням.
  3. Щоб побачити всі файли команди S3, використовуйте команду

    aws s3 ls s3: // your_bucket_name --рекурсивний

Посилання на використання AWS кліпу для різних служб 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/…
Rajesh

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] 50KiB pi.png
[2016-05-10 14:34:39 IST] 365KiB upton.pdf

Примітка:

  • s3: Псевдоніми для Amazon S3
  • kline: ім'я відра AWS S3

Встановлення Minio Client Linux Завантажте mc для:

$ chmod 755 мс
$ ./mc - допомогти

Налаштування облікових даних AWS з клієнтом Minio

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

Примітка. Будь ласка, замініть mys3 на псевдонім, який ви хотіли б для цього облікового запису, і, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEcc5gVQUSSx5ohQ9GSrr12 вашими AWS ACCESS-KEY та SECRET-KEY

Сподіваюся, це допомагає.

Відмова: Я працюю на Minio


Будь ласка, будь-де ділитися секретним ключем IAM.
Олексій Важнов

1

Ви можете використовувати стандартні s3 api -

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 (парами, функція (помилка, результат) {});

щоб отримати всі предмети всередині відра. ви повинні передати ім'я відра всередині парам (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
Дякуємо за цей фрагмент коду, який може надати деяку обмежену та негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення, показавши, чому це хороше рішення проблеми, та зробило б кориснішим майбутнім читачам інші подібні питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
Toby Speight

0

Спрощена та оновлена ​​версія відповіді Скали Паоло:

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

Використовуйте плюмбум, щоб обернути кліп, і ви матимете чіткий синтаксис:

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 http://s3browser.com/ та використовувати Генератор веб-URL-адрес для створення списку повних шляхів посилання. Це дуже зручно і включає близько 3 клацань.

-Browse to Folder
-Select All
-Generate Urls

Вдачі вам

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.