我有下面的工作代码来从Amazons 3中删除对象
params := &s3.DeleteObjectInput{
Bucket: aws.String("Bucketname"),
Key : aws.String("ObjectKey"),
}
s3Conn.DeleteObjects(params)
但我想做的是删除所有文件夹下使用通配符**。我知道amazon 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)
我知道在php中可以很容易地通过 s3->delete_all_objects 按照this answer来完成。在GOlang中是否可以执行相同的操作。
5条答案
按热度按时间hlswsv351#
不幸的是,goamz包没有类似于PHP库的
delete_all_objects
的方法。但是,PHP
delete_all_objects
的源代码可以在这里获得(切换源代码视图):http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonS3/delete_all_objects以下是重要的代码行:
如您所见,PHP代码实际上会在存储桶上发出一个HTTP请求,首先获取所有匹配
PCRE_ALL
的文件,在其他地方定义为const PCRE_ALL = '/.*/i';
。您一次只能删除1000个文件,因此
delete_all_objects
创建了一个批处理函数来一次删除1000个文件。你必须在你的go程序中创建相同的功能,因为goamz包还不支持这个。幸运的是,它应该只有几行代码,并且您可以从PHP库中获得指南。
完成后,提交一个goamz包的pull request可能是值得的!
n7taea2i2#
使用mc工具,您可以执行以下操作:
mc rm -r --force https://BucketName.s3.amazonaws.com/x/y
它将删除所有前缀为“x/y”的对象
你可以用minio-go来实现同样的功能:
neekobn83#
自从提出这个问题以来,S3的AWS GoLang库在S3 Manager中接收了一些新方法来处理此任务(响应@Itachi的pr)。
参见Github记录:https://github.com/aws/aws-sdk-go/issues/448#issuecomment-309078450
以下是v1中的示例:https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/go/s3/DeleteObjects/DeleteObjects.go#L36
要在bucket内的路径上获得“通配符匹配”,请将Prefix参数添加到示例的ListObjectsInput调用中,如下所示:
oyxsuwqo4#
在游戏中有点晚了,但因为我有同样的问题,我创建了一个小的pkg,您可以复制到您的代码库并根据需要导入。
因此,如果您有一个名为“somebucket”的桶,其结构如下:
s3://somebucket/foo/some-prefixed-folder/bar/test.txt
并希望从some-prefixed-folder
开始删除,则用法如下:由于
ListObjectsV2
的实现,这个实现只允许从给定的前缀中删除最多1000个条目--但是它是分页的,所以需要添加功能来不断刷新结果,直到结果< 1000。wfveoks05#
我能够使用CLI中的通配符删除S3存储桶中的对象