繁体   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