Amazon S3 将多个文件从一个存储桶复制到另一个存储桶
Amazon S3 copying multiple files from one bucket to another
我在源 S3 存储桶中有大量对象,我有选择地想将一部分对象复制到目标存储桶中。
根据 doc 这里似乎可以用 TransferManager.copy(from_bucket, from_key, to_bucket, to_key)
,但是我需要一次一个地做。
有没有人知道其他方法,最好是批量复制而不是为每个对象调用 copy()?
如果你想复制整个目录,你可以使用 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/"
然后只需使用 向下填充 复制公式。最后,复制命令并将它们粘贴到终端 window.
如果您问是否有一种方法可以使用 API 调用 以编程方式在存储桶之间复制倍数 ,那么答案是 没有,这是不可能的。每个 API 调用只会复制一个对象。但是,您可以并行发出多个复制命令以加快速度。
我认为可以通过 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);
}
我在源 S3 存储桶中有大量对象,我有选择地想将一部分对象复制到目标存储桶中。
根据 doc 这里似乎可以用 TransferManager.copy(from_bucket, from_key, to_bucket, to_key)
,但是我需要一次一个地做。
有没有人知道其他方法,最好是批量复制而不是为每个对象调用 copy()?
如果你想复制整个目录,你可以使用 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/"
然后只需使用 向下填充 复制公式。最后,复制命令并将它们粘贴到终端 window.
如果您问是否有一种方法可以使用 API 调用 以编程方式在存储桶之间复制倍数 ,那么答案是 没有,这是不可能的。每个 API 调用只会复制一个对象。但是,您可以并行发出多个复制命令以加快速度。
我认为可以通过 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);
}