Cách nhanh chóng để liệt kê tất cả các tệp trong nhóm Amazon S3?


151

Tôi có một thùng am3 s3 có hàng chục ngàn tên tệp trong đó. Cách dễ nhất để có được một tệp văn bản liệt kê tất cả các tên tệp trong nhóm?


Như được ám chỉ bởi nhận xét của jldupont về câu trả lời do vdaubry cung cấp, boto.s3.bucketlistresultset.BucketListResultSetgiải quyết điều kiện "hàng chục ngàn tên tệp" được đề cập trong câu hỏi.
chb

1
Xin lưu ý rằng đối với các nhóm có số lượng đối tượng rất lớn, giả sử hàng triệu hoặc hàng tỷ, các phương pháp mã hóa / kịch bản dưới đây sẽ không hoạt động tốt. Thay vào đó, bạn nên bật S3 Inventory và truy xuất báo cáo tồn kho.
jarmod

Câu trả lời:


120

Tôi khuyên bạn nên sử dụng boto . Sau đó là một vài dòng trăn nhanh chóng :

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

Lưu cái này dưới dạng list.py, mở một thiết bị đầu cuối, rồi chạy:

$ python list.py > results.txt

3
Nếu bạn nhận được: boto.exception.S3ResponseError: S3ResponseError: 403 Bị cấm Đảm bảo chính sách người dùng cho khóa Truy cập / Bí mật có quyền truy cập vào S3.
topherjaynes

1
Tôi đã gặp lỗi 403 và tôi đã phải làm theo hướng dẫn này để làm cho nó hoạt động: stackoverflow.com/a/22462419/1143558
Ljubisa Livac

Làm thế nào để bạn lặp qua nó trong bash?
SuperUberDuper

4
Bạn có thể thêm một biến thể cho điều này bằng cách sử dụng gói boto3 mới không?
yeliabsalohcin

@yeliabsalohcin xem câu trả lời của tôi
Casey

62

AWS CLI

Tài liệu cho aws s3 ls

AWS gần đây đã phát hành Công cụ dòng lệnh của họ. Điều này hoạt động giống như boto và có thể được cài đặt bằng sudo easy_install awsclihoặcsudo pip install awscli

Khi bạn đã cài đặt, bạn có thể chạy

aws s3 ls

Nó sẽ cho bạn thấy tất cả các thùng có sẵn của bạn

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

Sau đó, bạn có thể truy vấn một nhóm cụ thể cho các tệp.

Lệnh :

aws s3 ls s3://mybucket

Đầu ra :

Bucket: mybucket
Prefix:

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

Điều này sẽ cho bạn thấy tất cả các tập tin của bạn.


14
Thêm --recursivecờ để xem tất cả các đối tượng trong thư mục được chỉ định
Chris Bloom

2
Có cách nào để phân tích tên ra? Tôi đang tìm kiếm một danh sách các tập tin trong một thùng s3 để liệt kê lại.
Casey

Ngoài ra, s3 mã hóa tên tệp được sử dụng làm URL, đây chỉ là tên tệp thô ..
Casey

42

s3cmd là vô giá cho loại điều này

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


1
s3cmdtrả về tên tệp được sắp xếp theo ngày. Có cách nào tôi có thể làm cho nó trở lại chỉ nói những tập tin đã được thêm vào sau 2015-10-23 20:46không?
SexyBeast

Lưu ý rằng nếu tên tệp có khoảng trắng thì điều này có một trục trặc nhỏ nhưng tôi không có awk-foo để sửa nó
Colin D

36

Hãy cẩn thận, danh sách amazon chỉ trả về 1000 tệp. Nếu bạn muốn lặp lại tất cả các tệp, bạn phải phân trang kết quả bằng cách sử dụng các dấu:

Trong ruby ​​sử dụng 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

kết thúc

Hy vọng điều này sẽ giúp, vincent



Cảm ơn vì điều này, tôi đã có một khoảng thời gian khó khăn để tìm cách đặt điểm đánh dấu: 1:
Adrian Magdas

20

Cập nhật ngày 15/02/2016:

Lệnh này sẽ cung cấp cho bạn một danh sách tất cả các nhóm trong AWS S3:

aws s3 ls

Lệnh này sẽ cung cấp cho bạn một danh sách tất cả các đối tượng cấp cao nhất trong nhóm AWS S3:

aws s3 ls bucket-name

Lệnh này sẽ cung cấp cho bạn một danh sách TẤT CẢ các đối tượng bên trong nhóm AWS S3:

aws s3 ls bucket-name --recursive

Lệnh này sẽ đặt một danh sách TẤT CẢ bên trong nhóm AWS S3 ... bên trong tệp văn bản trong thư mục hiện tại của bạn:

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


Điều này hoạt động nhưng không thực sự là những gì tôi cần. Nó chỉ liệt kê tất cả các tiền tố "cấp cao nhất". Có cách nào để có được tất cả các đối tượng trong một thùng, tiền tố và tất cả không?
rinogo

Cập nhật: Câu trả lời của @sysuser là những gì tôi cần.
rinogo

@rinogo Nó không phù hợp với nhu cầu của bạn có thể ... nhưng nó hoạt động và đó là những gì được tính ở đây. Nó phù hợp với nhu cầu của ppl khác như là một câu trả lời chính xác.
Khalil Gharbaoui

Như tôi đã nói, nó hoạt động - cảm ơn bạn! Nhưng nó không trả lời câu hỏi của OP. OP đã yêu cầu một cách để "[liệt kê] tất cả tên tệp trong nhóm". Điều này chỉ liệt kê các đối tượng cấp cao nhất, không phải tất cả các đối tượng.
rinogo

2
Aha nhưng điều đó không khó thực hiện. Chỉ cần thêm '--recursive' vào lệnh. Tôi sẽ thêm nó vào câu trả lời của mình, cảm ơn vì đã chỉ ra điều đó
Khalil Gharbaoui

12

Đối với các nhà phát triển Scala, đây là chức năng đệ quy để thực hiện quét toàn bộ và ánh xạ nội dung của nhóm AmazonS3 bằng SDK AWS chính thức cho 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))
}

Để gọi hàm được xử lý ở trên map(), chỉ cần chuyển đối tượng AmazonS3Client đã được xây dựng (và khởi tạo đúng cách) (tham khảo SDK AWS chính thức cho Tham chiếu API Java ), tên nhóm và tên tiền tố trong danh sách tham số đầu tiên. Đồng thời chuyển hàm f()bạn muốn áp dụng để ánh xạ từng tóm tắt đối tượng trong danh sách tham số thứ hai.

Ví dụ

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

sẽ trả về danh sách đầy đủ các (key, owner)bộ dữ liệu trong nhóm / tiền tố đó

hoặc là

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

như bạn thường tiếp cận bởi Monads trong Lập trình hàm


Có một lỗi với mã này. Nếu lần quét ban đầu bị cắt ngắn, lần trả lại cuối cùng sẽ chỉ quay lại mapped.toListmà không có bất kỳ lần nào trước đóacc
Mark Wang

Cảm ơn - lưu ý rằng AmazonS3Client giờ chỉ là AmazonS3.
Anthony Holland

11

Có một số cách bạn có thể đi về nó. Sử dụng 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)

Một cách khác là sử dụng AWS cli cho nó

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

nếu aws đã được cấu hình, người ta có thể thay thế dòng 2 và 3 bằngs3 = boto3.resource('s3')
sinapan

Nếu bạn đã đặt các biến môi trường, bạn không cần sử dụng các biến trong sessionphương thức. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Flavio

7

Sau zach tôi cũng muốn giới thiệu boto , nhưng tôi cần tạo một chút khác biệt cho mã của anh ấy:

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

3
Việc sửa đổi là cần thiết vì mã gốc không hoạt động tại một thời điểm.
Datageek

1
conn.lookuptrả về Nonethay vì ném S3ResponseError(NoSuchBucket)lỗi
Ehtesh Choudhury


5

Đối với boto3 của Python sau khi sử dụng aws configure:

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

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

5

Làm đầu tiên chắc chắn bạn đang ở trên một instance terminalvà bạn có all accesscủa S3trong IAMbạn đang sử dụng. Ví dụ tôi đã sử dụng một ví dụ ec2.

pip3 install awscli

Sau đó cấu hình aws

aws configure

Sau đó điền outcredantials 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)

Bây giờ, Xem tất cả các thùng

aws s3 ls

Lưu trữ tất cả các tên xô

aws s3 ls > output.txt

Xem tất cả cấu trúc tệp trong một nhóm

aws s3 ls bucket-name --recursive

Lưu trữ cấu trúc tệp trong mỗi nhóm

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

Hi vọng điêu nay co ich.


hoạt động ... nhưng mất for-e-ver để lấy toàn bộ xô
gvasquez

4

AWS CLI có thể cho phép bạn xem tất cả các tệp của nhóm S3 một cách nhanh chóng và cũng giúp thực hiện các hoạt động khác.

Để sử dụng AWS CLI, hãy làm theo các bước dưới đây:

  1. Cài đặt AWS CLI.
  2. Định cấu hình AWS CLI để sử dụng thông tin xác thực bảo mật mặc định và Vùng AWS mặc định.
  3. Để xem tất cả các tệp của nhóm S3, hãy sử dụng lệnh

    aws s3 ls s3: // your_bucket_name --recursive

Tham khảo để sử dụng AWS cli cho các dịch vụ AWS khác nhau: https://docs.aws.amazon.com/cli/latest/reference/


3

Trong Java, bạn có thể nhận các khóa bằng cách sử dụng ListObjects (xem tài liệu 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());

Có thêm một API đơn giản, có tên xô và liệt kê các đối tượng có trong nó. ObjectListing object = s3client.listObjects (buckName) liên kết javadoc được đưa ra dưới đây, docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ tựa
Rajesh

2

Mã trong python sử dụng lib "boto" tuyệt vời . Mã này trả về một danh sách các tệp trong một nhóm và cũng xử lý các trường hợp ngoại lệ cho các thùng bị thiếu.

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

Đừng quên thay thế <PLACE_HOLDERS> bằng các giá trị của bạn.


2

Lệnh dưới đây sẽ nhận được tất cả các tên tệp từ nhóm AWS S3 của bạn và ghi vào tệp văn bản trong thư mục hiện tại của bạn:

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

1

Ngoài ra, bạn có thể sử dụng Minio Client aka mc. Nguồn mở của nó và tương thích với AWS S3. Nó có sẵn cho Linux, Windows, Mac, FreeBSD.

Tất cả những gì bạn phải làm là chạy lệnh mc ls để liệt kê nội dung.

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

Ghi chú:

  • s3: Bí danh cho Amazon S3
  • kline: tên nhóm AWS S3

Cài đặt Minio Client Linux Tải mc cho:

$ chmod 755 mc
$ ./mc - trợ giúp

Thiết lập thông tin đăng nhập AWS với Minio Client

$ mc cấu hình máy chủ thêm mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

Lưu ý: Vui lòng thay thế mys3 bằng bí danh mà bạn muốn cho tài khoản này và, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 bằng AWS ACCESS-KEY của bạn

Hy vọng nó giúp.

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho Minio


Xin vui lòng tránh chia sẻ khóa bí mật IAM ở bất cứ đâu.
Alexey Vazhnov

1

Bạn có thể sử dụng api s3 tiêu chuẩn -

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

1

Bạn có thể liệt kê tất cả các tệp, trong thùng aws s3 bằng lệnh

aws s3 ls path/to/file

và để lưu nó trong một tập tin, sử dụng

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

nếu bạn muốn nối kết quả của mình vào một tệp khác:

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

nếu bạn muốn xóa những gì đã được viết trước đó.

Nó sẽ hoạt động cả trong windows và Linux.


1

Trong javascript bạn có thể sử dụng

s3.listObjects (params, hàm (err, result) {});

để có được tất cả các đối tượng trong xô. bạn phải chuyển tên nhóm bên trong params (Nhóm: tên) .


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
Bạn đang sử dụng lớp S3 nào? Tôi có thể lấy nó ở đâu?
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
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Toby Speight

0

Phiên bản đơn giản và cập nhật của câu trả lời Scala của 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))
}

Tước ra các tổng quát và sử dụng ListObjectRequest được tạo bởi các nhà xây dựng 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
Tôi đoán đây là nguyên mẫu Java hoặc một cái gì đó nhưng xin vui lòng giải thích nó.
Doncho Gunchev

0

Trong PHP, bạn có thể nhận được danh sách đầy đủ các đối tượng AWS-S3 bên trong nhóm cụ thể bằng cách sử dụng cuộc gọi sau

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

Bạn có thể chuyển hướng đầu ra của đoạn mã trên vào một tệp để lấy danh sách các khóa.


0

Sử dụng plumbum để bọc cli và bạn sẽ có một cú pháp rõ ràng:

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

0

vui lòng thử tập lệnh bash này. nó sử dụng lệnh curl mà không cần bất kỳ phụ thuộc bên ngoài nào

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

Cách DỄ DÀNG nhất để có được một tệp văn bản rất có thể sử dụng là tải xuống Trình duyệt S3 http://s3browser.com/ và sử dụng Trình tạo URL Web để tạo danh sách các đường dẫn liên kết hoàn chỉnh. Nó rất tiện dụng và liên quan đến khoảng 3 lần nhấp.

-Browse to Folder
-Select All
-Generate Urls

Nhưng điêu tôt đẹp nhât se đên vơi bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.