Szybki sposób na wyświetlenie wszystkich plików w zasobniku Amazon S3?


151

Mam wiadro amazon s3, które zawiera dziesiątki tysięcy nazw plików. Jaki jest najłatwiejszy sposób na uzyskanie pliku tekstowego zawierającego wszystkie nazwy plików w zasobniku?


Jak wspomina komentarz jlduponta dotyczący odpowiedzi udzielonej przez vdaubry, boto.s3.bucketlistresultset.BucketListResultSetdotyczy warunku „dziesiątki tysięcy nazw plików”, o którym mowa w pytaniu.
chb

1
Należy pamiętać, że w przypadku zasobników z bardzo dużą liczbą obiektów, powiedzmy milionami lub miliardami, poniższe podejścia do kodowania / tworzenia skryptów nie będą działać dobrze. Zamiast tego należy włączyć S3 Inventory i pobrać raport zapasów.
jarmod

Odpowiedzi:


120

Polecam używanie boto . Następnie jest kilka krótkich linii Pythona :

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')

Zapisz to jako list.py, otwórz terminal, a następnie uruchom:

$ python list.py > results.txt

3
Jeśli otrzymasz: boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden Upewnij się, że zasady użytkownika dotyczące klucza dostępu / klucza tajnego mają dostęp do S3.
topherjaynes

1
Otrzymałem błąd 403 i musiałem postępować zgodnie z instrukcją, aby to zadziałało: stackoverflow.com/a/22462419/1143558
Ljubisa Livac

jak przelecieć przez to w bash?
SuperUberDuper

4
Czy możesz dodać do tego wariant za pomocą nowego pakietu boto3?
yeliabsalohcin

@yeliabsalohcin zobacz moją odpowiedź
Casey

62

AWS CLI

Dokumentacja do aws s3 ls

AWS niedawno wydało swoje narzędzia wiersza poleceń. Działa to podobnie jak boto i można je zainstalować za pomocą sudo easy_install awsclilubsudo pip install awscli

Po zainstalowaniu możesz po prostu uruchomić

aws s3 ls

Który pokaże wszystkie dostępne wiadra

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

Następnie możesz wysłać zapytanie do konkretnego zasobnika o pliki.

Polecenie :

aws s3 ls s3://mybucket

Wyjście :

Bucket: mybucket
Prefix:

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

Spowoduje to wyświetlenie wszystkich plików.


14
Dodaj --recursiveflagę, aby zobaczyć wszystkie obiekty w określonym katalogu
Chris Bloom,

2
Czy istnieje sposób na przeanalizowanie nazw? Chcę zrobić listę plików w wiadrze s3 do wyliczenia.
Casey

ponadto s3 koduje nazwy plików, które mają być użyte jako adresy URL, są to tylko surowe nazwy plików ..
Casey

42

s3cmd jest nieoceniony do tego typu rzeczy

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


1
s3cmdzwraca nazwy plików posortowane według daty. Czy jest jakiś sposób, żebym mógł zwrócić tylko te pliki, które zostały dodane później 2015-10-23 20:46?
SexyBeast

Zwróć uwagę, że jeśli w nazwach plików są spacje, jest to mała usterka, ale nie mam awk-foo, aby to naprawić
Colin D

36

Uważaj, lista amazon zwraca tylko 1000 plików. Jeśli chcesz iterować po wszystkich plikach, musisz podzielić wyniki za pomocą znaczników:

W Ruby za pomocą 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

koniec

Mam nadzieję, że to pomoże, Vincent


7
boto obsługuje stronicowanie, patrz github.com/boto/boto/blob/develop/boto/s3/bucket.py
jldupont

Dzięki za to, ciężko mi było znaleźć sposób ustawienia znacznika: 1:
Adrian Magdas

20

Aktualizacja 15-02-2019:

To polecenie wyświetli listę wszystkich zasobników w AWS S3:

aws s3 ls

To polecenie wyświetli listę wszystkich obiektów najwyższego poziomu w zasobniku AWS S3:

aws s3 ls bucket-name

To polecenie wyświetli listę WSZYSTKICH obiektów w zasobniku AWS S3:

aws s3 ls bucket-name --recursive

To polecenie umieści listę WSZYSTKICH w zasobniku AWS S3 ... wewnątrz pliku tekstowego w bieżącym katalogu:

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


To działa, ale nie jest tym, czego potrzebuję. Po prostu wymienia wszystkie przedrostki „najwyższego poziomu”. Czy istnieje sposób na pobranie wszystkich obiektów do zasobnika, prefiksów i wszystkiego?
rinogo

Aktualizacja: odpowiedź od @sysuser jest tym, czego potrzebowałem.
rinogo

@rinogo Może nie pasuje do twoich potrzeb ... ale działa i to się tutaj liczy. Odpowiada potrzebom innych osób jako poprawna odpowiedź.
Khalil Gharbaoui

Jak powiedziałem, działa - dziękuję! Ale to nie odpowiada na pytanie OP. OP poprosił o sposób na „[wyświetlenie] wszystkich nazw plików w zasobniku”. Zawiera tylko obiekty najwyższego poziomu, a nie wszystkie obiekty.
rinogo

2
Aha, ale nie jest to trudne. Po prostu dodaj „--recursive” do polecenia. Dodam to do mojej odpowiedzi dzięki za wskazanie tego
Khalil Gharbaoui,

12

Dla programistów Scala jest to rekurencyjna funkcja wykonywania pełnego skanowania i mapowania zawartości zasobnika AmazonS3 przy użyciu oficjalnego zestawu AWS SDK dla języka 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))
}

Aby wywołać powyższą map()funkcję curried , po prostu przekaż już skonstruowany (i poprawnie zainicjowany) obiekt AmazonS3Client (patrz oficjalny AWS SDK for Java API Reference ), nazwę zasobnika i nazwę prefiksu na pierwszej liście parametrów. Przekaż także funkcję, f()którą chcesz zastosować, aby odwzorować podsumowanie każdego obiektu na drugiej liście parametrów.

Na przykład

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

zwróci pełną listę (key, owner)krotek w tym zasobniku / przedrostku

lub

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

tak, jak zwykle podejście Monady w programowaniu funkcjonalnym


W tym kodzie jest błąd. Jeśli początkowy skan zostanie obcięty, ostateczny powrót powróci tylko mapped.toListbez żadnego z poprzednichacc
Mark Wang

Dzięki - zauważ, że AmazonS3Client powinien teraz być po prostu AmazonS3.
Anthony Holland

11

Można to zrobić na kilka sposobów. Korzystanie z Pythona

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)

Innym sposobem jest użycie do tego celu AWS cli

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

jeśli aws jest już skonfigurowane, można zamienić linie 2 i 3 nas3 = boto3.resource('s3')
sinapan

Jeśli masz umieszczone zmienne środowiskowe, nie musisz używać zmiennych w sessionmetodzie. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio

7

Po zach też poleciłbym boto , ale musiałem trochę zmienić jego kod:

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

3
Modyfikacja była konieczna, ponieważ oryginalny kod nie działał w danym momencie.
Datageek

1
conn.lookupzwraca Nonezamiast wyrzucać S3ResponseError(NoSuchBucket)błąd
Ehtesh Choudhury,


5

Dla boto3 Pythona po użyciu aws configure:

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

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

5

Najpierw upewnij się, jesteś na instance terminali trzeba all accessod S3w IAMktórej używasz. Na przykład użyłem instancji ec2.

pip3 install awscli

Następnie skonfiguruj aws

aws configure

Następnie wypełnijśredniki, np .: -

$ 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)

Teraz zobacz wszystkie zasobniki

aws s3 ls

Przechowuj nazwy wszystkich zasobników

aws s3 ls > output.txt

Zobacz całą strukturę plików w wiadrze

aws s3 ls bucket-name --recursive

Przechowuj strukturę plików w każdym zasobniku

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

Mam nadzieję że to pomoże.


działa ... ale zabiera całe wiadro
gvasquez

4

Interfejs wiersza polecenia AWS umożliwia szybkie przeglądanie wszystkich plików zasobnika S3 i pomaga w wykonywaniu innych operacji.

Aby użyć AWS CLI, wykonaj poniższe czynności:

  1. Zainstaluj AWS CLI.
  2. Skonfiguruj interfejs wiersza polecenia AWS do korzystania z domyślnych poświadczeń bezpieczeństwa i domyślnego regionu AWS.
  3. Aby zobaczyć wszystkie pliki zasobnika S3, użyj polecenia

    aws s3 ls s3: // nazwa_Twojego_bierka --recursive

Odniesienie do używania AWS cli dla różnych usług AWS: https://docs.aws.amazon.com/cli/latest/reference/


3

W Javie możesz uzyskać klucze za pomocą ListObjects (zobacz dokumentację 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());

Dostępny jest jeszcze jeden prosty interfejs API, który pobiera nazwę zasobnika i wyświetla listę obiektów w nim obecnych. ObjectListing objects = s3client.listObjects (bucketName) link javadoc jest podany poniżej, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ ...
Rajesh

2

Koduj w Pythonie przy użyciu niesamowitej biblioteki „boto” . Kod zwraca listę plików w zasobniku, a także obsługuje wyjątki dla brakujących zasobników.

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() ]

Nie zapomnij zastąpić <PLACE_HOLDERS> swoimi wartościami.


2

Poniższe polecenie pobierze wszystkie nazwy plików z twojego zasobnika AWS S3 i zapisze do pliku tekstowego w twoim bieżącym katalogu:

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

1

Alternatywnie możesz użyć klienta Minio aka mc. Jego Open Source i kompatybilny z AWS S3. Jest dostępny dla systemów Linux, Windows, Mac, FreeBSD.

Wszystko, co musisz zrobić, to uruchomić polecenie mc ls, aby wyświetlić zawartość.

$ mc ls s3 / kline /
[30.04.2016 13:20:47 IST] 1.1MiB 1.jpg
[30.04.2016 16:03:55 IST] 7,5KiB docker.png
[30.04.2016 15:16:17 IST] 50KiB pi.png
[10.05.2016 14:34:39 IST] 365KiB upton.pdf

Uwaga:

  • s3: Alias ​​dla Amazon S3
  • kline: nazwa zasobnika AWS S3

Instalowanie klienta Minio dla systemu Linux Pobierz mc dla:

$ chmod 755 mc
$ ./mc --help

Konfigurowanie poświadczeń AWS za pomocą klienta Minio

Host konfiguracji $ mc dodaj mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

Uwaga: zamień mys3 na alias, który chcesz dla tego konta, a BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 na swój klucz AWS ACCESS-KEY i SECRET-KEY

Mam nadzieję, że to pomoże.

Zastrzeżenie: pracuję dla Minio


Unikaj udostępniania tajnego klucza IAM w dowolnym miejscu.
Alexey Vazhnov

1

Możesz użyć standardowego interfejsu API S3 -

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

1

Możesz wyświetlić listę wszystkich plików w zasobniku aws s3 za pomocą polecenia

aws s3 ls path/to/file

i aby zapisać go w pliku, użyj

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

jeśli chcesz dołączyć swój wynik do pliku, w przeciwnym razie:

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

jeśli chcesz wyjaśnić, co zostało napisane wcześniej.

Będzie działać zarówno w systemie Windows, jak i Linux.


1

W javascript możesz użyć

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

aby umieścić wszystkie obiekty w wiadrze. musisz przekazać nazwę zasobnika wewnątrz params (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
Której klasy S3 używasz? Gdzie mogę to dostać?
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
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość, pokazując, dlaczego jest to dobre rozwiązanie problemu, i uczyniłoby go bardziej użytecznym dla przyszłych czytelników z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Toby Speight

0

Uproszczona i zaktualizowana wersja odpowiedzi Scala autorstwa 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))
}

Usunięcie elementów ogólnych i użycie ListObjectRequest wygenerowanego przez konstruktory zestawu 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
Myślę, że to prototyp Javy czy coś w tym rodzaju, ale proszę wyjaśnij to.
Doncho Gunchev

0

W PHP możesz uzyskać pełną listę obiektów AWS-S3 wewnątrz określonego zasobnika, używając następującego wywołania

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

Możesz przekierować wyjście powyższego kodu do pliku, aby uzyskać listę kluczy.


0

Użyj plumbum, aby zawinąć CLI, a otrzymasz jasną składnię:

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

0

spróbuj tego skryptu bash. używa polecenia curl bez konieczności stosowania jakichkolwiek zewnętrznych zależności

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

NAJŁATWIEJSZY sposób na uzyskanie bardzo użytecznego pliku tekstowego polega na pobraniu przeglądarki S3 Browser http://s3browser.com/ i skorzystaniu z generatora adresów internetowych w celu utworzenia listy pełnych ścieżek linków. Jest bardzo poręczny i wymaga około 3 kliknięć.

-Browse to Folder
-Select All
-Generate Urls

Powodzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.