Amazon S3将多个文件从一个存储桶复制到另一个存储桶

时间:2020-04-22 03:47:35

标签: amazon-web-services amazon-s3 aws-java-sdk

我在源S3存储桶中有大量对象,我有选择地希望将对象的子集复制到目标存储桶中。 根据{{​​3}}的说法,TransferManager.copy(from_bucket, from_key, to_bucket, to_key)似乎有可能,但是我需要一次做一次。

有人知道其他方法吗,最好是分批复制而不是为每个对象调用copy()?

2 个答案:

答案 0 :(得分:1)

如果您希望复制整个目录,则可以使用AWS Command-Line Interface (CLI)

aws s3 cp --recursive s3://source-bucket/folder/* s3://destination-bucket/folder/

但是,由于您希望选择性地复制文件,所以没有简单的方法来指示要复制的文件(除非它们都具有相同的前缀)。

坦白说,当我需要复制选择性文件时,实际上我创建了一个包含文件名列表的Excel 文件。然后,我创建一个像这样的公式:

="aws s3 cp s3://source-bucket/"&A1&" s3://destination-bucket/"

然后只需使用 Fill Down (复制)即可复制公式。最后,复制命令并将其粘贴到“终端”窗口中。

如果您要问是否有一种方法可以使用一个API调用在存储桶之间以编程方式复制多个副本,那么答案是否,这是不可能的。每个API调用只会复制一个对象。但是,您可以并行发出多个复制命令,以加快处理速度。

答案 1 :(得分:0)

我认为可以通过S3控制台进行操作,但使用SDK则没有这种选择。尽管这不是解决问题的方法,但是此脚本一次有选择地复制一个对象,如果您正在从外部文件中读取文件,则只需在其中输入文件名即可。

ArrayList<String> filesToBeCopied = new ArrayList<String>();
filesToBeCopied.add("sample.svg");
filesToBeCopied.add("sample.png");
String from_bucket_name = "bucket1";
String to_bucket = "bucket2";
BasicAWSCredentials creds = new BasicAWSCredentials("<key>","<secret>");
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_SOUTH_1)
        .withCredentials(new AWSStaticCredentialsProvider(creds)).build();
ListObjectsV2Result result = s3.listObjectsV2(from_bucket_name);
List<S3ObjectSummary> objects = result.getObjectSummaries();
try {
    for (S3ObjectSummary os : objects) {
        String bucketKey = os.getKey();
        if (filesToBeCopied.contains(bucketKey)) {
             s3.copyObject(from_bucket_name, bucketKey, to_bucket, bucketKey);
        }
    }

} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}