【问题标题】:How to get the last X modified files from s3 bucket如何从 s3 存储桶中获取最后 X 个修改的文件
【发布时间】:2019-03-03 02:23:16
【问题描述】:

我的桶里有很多钥匙(压缩的)。

我们只想从 s3 请求最后创建的 X 个键。

我们使用 Java API。但是,我找不到如何只获取最后修改/创建的方法。

我们自己对列表进行了排序,但仍然没有得到最后 X 项。这是有问题的,因为这个桶可能很大,我们不想检索所有结果并对其进行排序。

public List<MyObject> getResults(int numberOfResults) {
        ObjectListing listing = s3Client.listObjects(new ListObjectsRequest()
                .withBucketName(bucketName)
                .withMaxKeys(numberOfResults));
        List<S3ObjectSummary> list = listing.getObjectSummaries();

// our internal sorting logic:

        List<MyObject> myObjects = list.stream().map(item ->
              MyObject.builder().resultKey(item.getKey()).createdDate(item.getLastModified()).build()).sorted(Comparator.comparing(MyObject::getCreatedDate))
                .collect(Collectors.toList());
        return myObjects;
    }

有什么想法吗?

【问题讨论】:

  • 文件如何更新和上传?是否只能通过同一个 Java 应用程序?

标签: amazon-web-services amazon-s3


【解决方案1】:

我也遇到过同样的挑战,并且能够使用以下命令从 S3 API 获取信息:

aws s3api list-objects-v2 --max-items 3 --query "reverse(sort_by(Contents,&LastModified))" --bucket <bucketName>

您可以将--max-items 调整为您需要的X

希望以后对他人有所帮助!

【讨论】:

    【解决方案2】:

    我认为 Aws 没有提供在服务器端执行此操作的方法。您可以使用客户端过滤。通过 CLI,您可以像 aws s3api list-objects --bucket bucketName --query "sort_by(keys,LastModified)"

    一样执行此操作

    【讨论】:

    • 如果我进行客户端过滤,如果我最终有很多文件,我可能会出现内存不足,不是吗?如何通过 java 使用 cli?
    • 可以使用java ProcessBuilder调用CLI命令ProcessBuilder pb = new ProcessBuilder( command ); Process p = pb.start(); InputStream is = p.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { System.out.println(line); }
    • list-objects 将采用 Contents 而不是 keys 作为排序参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2016-06-22
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多