第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用通配符匹配刪除 s3 中的對象

使用通配符匹配刪除 s3 中的對象

Go
江戶川亂折騰 2021-11-22 18:19:25
我有以下工作代碼可以從 Amazon s3 中刪除一個對象params := &s3.DeleteObjectInput{        Bucket: aws.String("Bucketname"),        Key : aws.String("ObjectKey"),    }s3Conn.DeleteObjects(params)但我想要做的是使用通配符**刪除文件夾下的所有文件。我知道亞馬遜 s3 不會將“x/y/file.jpg”視為 x 中的文件夾 y,但我想要實現(xiàn)的是通過提及“x/y*”刪除所有具有相同前綴的后續(xù)對象。嘗試亞馬遜多對象刪除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根據(jù)這個答案輕松完成。在 GOlang 中是否可以執(zhí)行相同的操作。
查看完整描述

3 回答

?
達令說

TA貢獻1821條經(jīng)驗 獲得超6個贊

不幸的是 goamz 包沒有類似于 PHP 庫的delete_all_objects.


但是,delete_all_objects此處提供了 PHP 的源代碼(切換源視圖):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 代碼實際上會在存儲桶上發(fā)出 HTTP 請求以首先獲取所有匹配的文件PCRE_ALL,該文件在別處定義為const PCRE_ALL = '/.*/i';.


您一次只能刪除 1000 個文件,因此delete_all_objects創(chuàng)建了一次刪除 1000 個文件的批處理功能。


您必須在 go 程序中創(chuàng)建相同的功能,因為 goamz 包尚不支持此功能。幸運的是,它應(yīng)該只有幾行代碼,而且您有來自 PHP 庫的指南。


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


查看完整回答
反對 回復(fù) 2021-11-22
?
慕森王

TA貢獻1777條經(jīng)驗 獲得超3個贊

使用mc工具,您可以:


mc rm -r --force https://BucketName.s3.amazonaws.com/x/y


它將刪除所有前綴為“x/y”的對象


您可以像這樣使用minio-go來實現(xiàn)與 Go 相同的效果:


package main


import (

    "log"


    "github.com/minio/minio-go"

)


func main() {

    config := minio.Config{

        AccessKeyID:     "YOUR-ACCESS-KEY-HERE",

        SecretAccessKey: "YOUR-PASSWORD-HERE",

        Endpoint:        "https://s3.amazonaws.com",

    }

    // find Your S3 endpoint here http://docs.aws.amazon.com/general/latest/gr/rande.html


    s3Client, err := minio.New(config)

    if err != nil {

        log.Fatalln(err)

    }

    isRecursive := true

    for object := range s3Client.ListObjects("BucketName", "x/y", isRecursive) {

        if object.Err != nil {

            log.Fatalln(object.Err)

        }

        err := s3Client.RemoveObject("BucketName", object.Key)

        if err != nil {

            log.Fatalln(err)

            continue

        }

        log.Println("Removed : " + object.Key)

    }

}


查看完整回答
反對 回復(fù) 2021-11-22
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

在游戲中有點晚,但由于我遇到了同樣的問題,我創(chuàng)建了一個小包,您可以將其復(fù)制到您的代碼庫并根據(jù)需要導(dǎo)入。


func ListKeysInPrefix(s s3iface.S3API, bucket, prefix string) ([]string, error) {

    res, err := s.Client.ListObjectsV2(&s3.ListObjectsV2Input{

        Bucket: aws.String(bucket),

        Prefix: aws.String(prefix),

    })

    if err != nil {

        return []string{}, err

    }


    var keys []string

    for _, key := range res.Contents {

        keys = append(keys, *key.Key)

    }

    return keys, nil

}


func createDeleteObjectsInput(keys []string) *s3.Delete {

    rm := []*s3.ObjectIdentifier{}

    for _, key := range keys {

        rm = append(rm, &s3.ObjectIdentifier{Key: aws.String(key)})

    }

    return &s3.Delete{Objects: rm, Quiet: aws.Bool(false)}

}


func DeletePrefix(s s3iface.S3API, bucket, prefix string) error {

    keys, err := s.ListKeysInPrefix(bucket, prefix)

    if err != nil {

        panic(err)

    }


    _, err = s.Client.DeleteObjects(&s3.DeleteObjectsInput{

        Bucket: aws.String(bucket),

        Delete: s.createDeleteObjectsInput(keys),

    })


    if err != nil {

        return err

    }

    return nil

}

因此,如果您有一個名為“somebucket”的存儲桶,其結(jié)構(gòu)如下:s3://somebucket/foo/some-prefixed-folder/bar/test.txt并且想從some-prefixed-folder以后刪除,用法將是:


func main() {

    // create your s3 client here

    // client := ....

    err := DeletePrefix(client, "somebucket", "some-prefixed-folder")

    if err != nil {

        panic(err)

    }

}

此實現(xiàn)僅允許從給定的前綴中刪除最多 1000 個條目,ListObjectsV2但它是分頁的,因此需要添加功能以保持刷新結(jié)果,直到結(jié)果 < 1000。


查看完整回答
反對 回復(fù) 2021-11-22
  • 3 回答
  • 0 關(guān)注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號