Массовое переименование файлов Amazon S3

#amazon-web-services #amazon-s3

Вопрос:

У меня в корзине Amazon S3 есть куча файлов, которые выглядят примерно так (их больше двух, их сотни):

 09292021-testpilot-state-test-callers-09-29-2021-970669454.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256amp;X-Amz-Credential=BRIAN72GRAHWB6KIND7M/20210930/us-east-1/s3/aws4_requestamp;X-Amz-Date=20210930T012101Zamp;X-Amz-Expires=172800amp;X-Amz-SignedHeaders=hostamp;X-Amz-Signature=8d4de3f18g2c178e1f6c94d0a09bf6a07ffr731454da5ec8940868f499cfc2bc

09272021-testpilot-state-test-callers-09-29-2021-970669454.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256amp;X-Amz-Credential=STEVE2313DJFSOODC/20210930/us-east-1/s3/aws4_requestamp;X-Amz-Date=20210930T012101Zamp;X-Amz-Expires=172800amp;X-Amz-SignedHeaders=hostamp;X-Amz-Signature=8d4de3f18g2c178e1f6c53-309f3f6a07ffr731454da5ec8940868f499cfc2bc
 

Я пытаюсь выполнить их массовое переименование , чтобы вы, по сути, удалили все после .csv , чтобы файлы выглядели как таковые:

 09292021-testpilot-state-test-callers-09-29-2021-970669454.csv

09272021-testpilot-state-test-callers-09-29-2021-970669454.csv
 

Каков был бы наиболее эффективный способ достижения этой цели?

Комментарии:

1. Сколько файлов? Если это 2, переименуйте их вручную. Если это 2 триллиона, напишите сценарий. Пакетные операции также могут помочь: docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html

2. Их больше двух, далеко за сотни. Как бы это выглядело?

3. Для выполнения этой задачи можно использовать пакет SDK Amazon S3. Самый простой способ-вызвать copyObject и передать новое имя.

4. @smac2020 Можете ли вы привести пример в ответах на то, как это будет выглядеть?

5. Обратите внимание, что вы не можете «переименовывать» объекты S3, по крайней мере, в традиционном смысле переименования чего-либо. Вам нужно будет скопировать, а затем удалить оригинал. Не забудьте также сохранить все соответствующие метаданные.

Ответ №1:

Для выполнения этой задачи можно использовать пакет SDK Amazon S3. Самый простой способ-вызвать copyObject и передать новое имя. Например, если вы должны были реализовать это на Java (вы также можете выполнить это на других языках, поддерживаемых AWS SDK), вы можете использовать этот код:

 package com.example.s3;

// snippet-start:[s3.java2.copy_object.import]
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
import software.amazon.awssdk.services.s3.model.CopyObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
// snippet-end:[s3.java2.copy_object.import]

/**
 * To run this AWS code example, ensure that you have setup your development environment, including your AWS credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */


public class CopyObject {

    public static void main(String[] args) {
        final String USAGE = "n"  
                "Usage:n"  
                "    <objectKey> <fromBucket> <toBucket>nn"  
                "Where:n"  
                "    objectKey - the name of the object (for example, book.pdf).nn"  
                "    fromBucket - the S3 bucket name that contains the object (for example, bucket1).n"  
                "    toBucket - the S3 bucket to copy the object to (for example, bucket2).n";

        if (args.length != 3) {
            System.out.println(USAGE);
            System.exit(1);
       }

        String objectKey = args[0];
        String fromBucket = args[1];
        String toBucket =  args[2];

        System.out.format("Copying object %s from bucket %s to %sn",
                objectKey, fromBucket, toBucket);

        Region region = Region.US_EAST_1;
        S3Client s3 = S3Client.builder()
                .region(region)
                .build();

        copyBucketObject (s3, fromBucket, objectKey, toBucket);
        s3.close();
    }

    // snippet-start:[s3.java2.copy_object.main]
    public static String copyBucketObject (S3Client s3, String fromBucket, String objectKey, String toBucket) {

        String encodedUrl = null;
        try {
            encodedUrl = URLEncoder.encode(fromBucket   "/"   objectKey, StandardCharsets.UTF_8.toString());
        } catch (UnsupportedEncodingException e) {
            System.out.println("URL could not be encoded: "   e.getMessage());
        }
        CopyObjectRequest copyReq = CopyObjectRequest.builder()
                .copySource(encodedUrl)
                .destinationBucket(toBucket)
                .destinationKey(objectKey)
                .build();

        try {
            CopyObjectResponse copyRes = s3.copyObject(copyReq);
            return copyRes.copyObjectResult().toString();
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }
    // snippet-end:[s3.java2.copy_object.main]
}
 

Комментарии:

1. OP также может потребоваться сохранить метаданные объекта. Не уверен, что это происходит по умолчанию с CopyObjectRequest.

2. @smac2020 спасибо тебе за это. Где в сценарии, однако, на самом деле все устраняется после .csv ?

3. Вы можете добавить эту задачу в свою логику. Поэтому следите за объектами, а затем, после того как вы их переименуете, вы можете удалить исходные объекты.