簡體   English   中英

僅列出 s3 存儲桶中的子文件夾

[英]Listing just the sub folders in an s3 bucket

我有一個 s3 結構如下:

s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file.

我需要做的是,給定 s3bucket 的名稱和一級密鑰的條目,我需要位於一級密鑰下的所有二級密鑰的名稱。 所以基本上如果我們把它看成一個文件夾,我會得到root folder的名稱,即s3bucketname和它的一個子文件夾subfolder1的名稱,我想列出 subfolder1 中的所有文件subfolder1 不過只是名字,不是完整的路徑。

有人可以指出如何使用亞馬遜的 java sdk 在 java 中做到這一點嗎?

謝謝

我做了以下代碼似乎工作正常,您必須傳遞prefix並確保前綴以/結尾,並且還指定要獲取子目錄列表的分隔符。 以下應該有效:

public List<String> listKeysInDirectory(String bucketName, String prefix) {
    String delimiter = "/";
    if (!prefix.endsWith(delimiter)) {
        prefix += delimiter;
    }

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName(bucketName).withPrefix(prefix)
            .withDelimiter(delimiter);
    ObjectListing objects = _client.listObjects(listObjectsRequest);
    return objects.getCommonPrefixes();
}

查爾斯版超級簡潔! 謝謝@ charles-menguy

我寫了一個擴展,通過分頁支持巨大的列表。

    public List<String> getSubPathsInS3Prefix(String bucketName, String prefix) {
        if (!prefix.endsWith(FILE_DELIMITER)) {
            prefix += FILE_DELIMITER;
        }
        List<String> paths = new ArrayList<String>();
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
                .withBucketName(bucketName).withPrefix(prefix)
                .withMaxKeys(1000).withDelimiter(FILE_DELIMITER);
        ObjectListing currentListing = s3Client.listObjects(listObjectsRequest);
        paths.addAll(currentListing.getCommonPrefixes());

        while (currentListing == null || currentListing.isTruncated()) {
            currentListing = s3Client.listNextBatchOfObjects(currentListing);
            paths.addAll(currentListing.getCommonPrefixes());
        }
        return paths;
    }

http://www.lazywiz.com/uncategorized/s3-missing-api-list-sub-paths-in-the-s3-bucket/

重要的是 S3 中沒有真正的文件夾概念。 但是讓我們看看 S3 API 可以使用哪些技巧。

在此示例中,列出了名為“lala”的特定“文件夾”下的所有“子文件夾”(鍵)(沒有該子文件夾的遞歸結構)。

Prefix="lala/" 和 Delimiter="/" 參數發揮了作用。

此外,此解決方案使用 S3 分頁器 API。即使結果包含超過 1000 個對象,該解決方案也會收集所有結果。 S3 分頁器 API 自動解析下一個結果從 1001 到 2000 等等。

# given "folder/key" structure
# .
# ├── lorem.txt
# ├─── lala
# │ ├── folder1
# │ │    ├── file1.txt
# │ │    └── file2.txt
# │ ├── folder2
# │ │    └── file1.txt
# │ └── folder3
# │      └── file1.txt
# └── lorem
#   └── folder4
#        ├── file1.txt
#        └── file2.txt

import boto3

s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')

# Execute paginated list_objects_v2
response = paginator.paginate(Bucket="your-bucket-name", Prefix="lala/", Delimiter="/")

# Get prefix for each page result
names = []
for page in response:
    names.extend([x["Prefix"] for x in page.get("CommonPrefixes", [])])

print(names)
# Result is:
# ['lala/folder1/','lala/folder2/','lala/folder3/']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM