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

Ita*_*chi 9 amazon-s3 go aws-sdk

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

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

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

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

我知道在php中它可以通过s3-> delete_all_objects按照这个答案轻松完成.在GOlang中可以采取相同的行动.

bvp*_*vpx 3

不幸的是,goamz 包没有类似于 PHP 库的delete_all_objects.

但是,PHP 的源代码delete_all_objects可在此处获取(切换源视图):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();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,PHP 代码实际上会在存储桶上发出 HTTP 请求,以首先获取所有匹配的文件,该文件在其他地方PCRE_ALL定义为。const PCRE_ALL = '/.*/i';

一次只能删除1000个文件,所以delete_all_objects创建了一个批量功能,一次删除1000个文件。

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

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