go - 使用通配符匹配删除 s3 中的对象

标签 go amazon-s3 aws-sdk

我有以下工作代码可以从 Amazon s3 中删除一个对象

params := &s3.DeleteObjectInput{
        Bucket: aws.String("Bucketname"),
        Key : aws.String("ObjectKey"),
    }
s3Conn.DeleteObjects(params)

但我想做的是使用通配符**删除文件夹下的所有文件。我知道亚马逊 s3 不会将“x/y/file.jpg”视为 x 内的文件夹 y,但我想要实现的是通过提及“x/y*”删除所有具有相同前缀的后续对象。试过amazon multi object delete

params := &s3.DeleteObjectsInput{
        Bucket: aws.String("BucketName"),
        Delete: &s3.Delete{
            Objects: []*s3.ObjectIdentifier {
                {
                    Key : aws.String("x/y/.*"), 
                },
            },
        },
    }
    result , err := s3Conn.DeleteObjects(params)

我知道在 php 中它可以通过 s3->delete_all_objects 轻松完成,根据 this answer .在 GOlang 中是否可以执行相同的操作。

最佳答案

不幸的是,goamz 包没有类似于 PHP 库的 delete_all_objects 的方法。

但是,PHP delete_all_objects 的源代码可在此处获得(切换源 View ):http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonS3/delete_all_objects

以下是重要的代码行:

public function delete_all_objects($bucket, $pcre = self::PCRE_ALL)
{
// Collect all matches
    $list = $this->get_object_list($bucket, array('pcre' => $pcre));

    // As long as we have at least one match...
    if (count($list) > 0)
    {
        $objects = array();

        foreach ($list as $object)
        {
            $objects[] = array('key' => $object);
        }

        $batch = new CFBatchRequest();
        $batch->use_credentials($this->credentials);

        foreach (array_chunk($objects, 1000) as $object_set)
        {
            $this->batch($batch)->delete_objects($bucket, array(
                'objects' => $object_set
            ));
        }

        $responses = $this->batch($batch)->send();

如您所见,PHP 代码实际上会在存储桶上发出 HTTP 请求,以首先获取与 PCRE_ALL 匹配的所有文件,该文件定义为 elsewhereconst PCRE_ALL = '/.*/i';.

您一次只能删除 1000 个文件,因此 delete_all_objects 然后创建一个批处理函数来一次删除 1000 个文件。

您必须在您的 go 程序中创建相同的功能,因为 goamz 包尚不支持此功能。幸运的是,它应该只有几行代码,并且您有来自 PHP 库的指南。

完成后,可能值得为 goamz 包提交拉取请求!

关于go - 使用通配符匹配删除 s3 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33811270/

相关文章:

android - 如何使用 AWSMobileClient 设置不同的配置(awsconfiguration.json)以进行调试和发布构建类型

go - 包装 io.PipeReader 来存储进度

arrays - 如何使用数组填充结构 slice ?

go - 有没有一种方法可以在 Go 中生成类似于 Python 的 `secrets` 模块的加密强随机数?

amazon-web-services - 列出大量 s3 存储桶对象到 out 文件

reactjs - React AWS Amplify S3 Storage.put() No Credentials 错误

testing - 如何去测试 Go 例程?

ios - 在 iOS Swift 中不使用 AWS SDK 在 Amazon S3 存储桶中上传背景图像(后台模式)

amazon-web-services - 如何获取 AWS JavaScript SDK 调用的响应 header ?

java - 如何配置 spring 应用程序以在 aws 上使用 IAM 角色(在 AWS ECS 中运行)并在 dev env 上使用凭据?