Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 如何从S3存储桶中递归删除文件_Amazon S3_Amazon Web Services - Fatal编程技术网

Amazon s3 如何从S3存储桶中递归删除文件

Amazon s3 如何从S3存储桶中递归删除文件,amazon-s3,amazon-web-services,Amazon S3,Amazon Web Services,我在S3中有以下文件夹结构。是否有一种方法可以递归删除某个文件夹下的所有文件(例如foo/bar1或foo或foo/bar2/1) 这过去需要对每个密钥(文件)进行专用API调用,但由于在2011年12月引入了: 新的“多对象删除”使您能够 只需一次请求,即可从S3存储桶中删除多达1000个对象 请参阅我对相关问题的回答,以了解有关这一点以及PHP中的各个示例的更多信息(从那时起,PHP就支持这一点) 同时,大多数AWS客户端库都以某种方式引入了对该功能的专用支持,例如: python 您可以通

我在S3中有以下文件夹结构。是否有一种方法可以递归删除某个文件夹下的所有文件(例如
foo/bar1或foo或foo/bar2/1


这过去需要对每个密钥(文件)进行专用API调用,但由于在2011年12月引入了:

新的“多对象删除”使您能够 只需一次请求,即可从S3存储桶中删除多达1000个对象

请参阅我对相关问题的回答,以了解有关这一点以及PHP中的各个示例的更多信息(从那时起,PHP就支持这一点)

同时,大多数AWS客户端库都以某种方式引入了对该功能的专用支持,例如:

python 您可以通过AWS的优秀Python接口实现这一点,大致如下(未经测试,从我的想法来看):

导入boto
s3=boto.connect_s3()
bucket=s3.获取bucket(“bucketname”)
bucketListResultSet=bucket.list(前缀=“foo/bar”)
结果=bucket.delete_key([bucketListResultSet中key的key.name])
红宝石 这是可用的,因为的和发行说明也提供了一个示例:

bucket=AWS::S3.new.bucket['mybucket']
#按键删除对象列表,每1k批量删除对象
#请求。接受字符串、AWS::S3::S3Object、AWS::S3::ObectVersion和
#使用:key和:version\u id散列
删除('key1','key2','key3',…)
#删除bucket中的所有对象(可选使用公共前缀,如图所示)
bucket.objects.with_前缀('2009/')。全部删除
#条件删除,仅以1k为单位批量加载和删除对象
#从块中删除那些返回true的
如果{124; object{124; object.key=~/\.pdf$/}删除{u
#清空bucket,然后删除bucket,1k批量删除对象
bucket.delete!
或:


您还可以考虑使用Amazon S3生命周期来创建具有前缀“代码> Foo/BAR1”的文件过期。

打开S3浏览器控制台并单击一个bucket。然后单击属性,然后单击生命周期

为前缀为
foo/bar1
的所有文件创建过期规则,并将日期设置为文件创建后的1天

保存,所有匹配的文件将在24小时内消失

完成后别忘了删除规则

没有API调用,没有第三方库、应用程序或脚本

我只是用这种方式删除了几百万个文件

显示生命周期规则窗口的屏幕截图(注意,在该截图中,前缀留空,影响bucket中的所有键):

对于最新版本,递归删除bucket中某个文件夹下的所有文件只需:

aws s3 rm --recursive s3://your_bucket_name/foo/
或者删除bucket下的所有内容:

aws s3 rm --recursive s3://your_bucket_name
如果您想要实际删除该bucket,则有一个单步快捷方式:

aws s3 rb --force s3://your_bucket_name
这将递归删除该存储桶中的内容,然后删除该存储桶


注意:
s3://
协议前缀是这些命令工作所必需的

我刚刚使用PowerShell从我的存储桶中删除了所有文件:

Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }

最好的方法是使用生命周期规则删除整个bucket内容。通过编程,您可以使用以下代码(PHP)来放置生命周期规则

$expiration = array('Date' => date('U', strtotime('GMT midnight')));
$result = $s3->putBucketLifecycle(array(
            'Bucket' => 'bucket-name',
            'Rules' => array(
                array(
                    'Expiration' => $expiration,
                    'ID' => 'rule-name',
                    'Prefix' => '',
                    'Status' => 'Enabled',
                ),
            ),
        ));
在上述情况下,所有对象将从开始日期-“今天GMT午夜”删除

您还可以按如下方式指定天数。但对于天,它将等待至少24小时(至少1天)开始删除桶中的内容

$expiration = array('Days' => 1);

通过在Linux机器上安装
s3cmd
软件包,您可以做到这一点


s3cmd rm s3://foo/bar——递归

刚刚看到Amazon在AWS控制台菜单中添加了“如何清空存储桶”选项:


我需要执行以下操作

def delete_bucket
  s3 = init_amazon_s3
  s3.buckets['BUCKET-NAME'].objects.each do |obj|
    obj.delete
  end
end

def init_amazon_s3
  config = YAML.load_file("#{Rails.root}/config/s3.yml")
  AWS.config(:access_key_id => config['access_key_id'],:secret_access_key => config['secret_access_key'])
  s3 = AWS::S3.new
end

在ruby V2中使用AWS-SKD的情况下

s3.list_objects(bucket: bucket_name, prefix: "foo/").contents.each do |obj|
  next if obj.key == "foo/" 
  resp = s3.delete_object({
    bucket: bucket_name,
    key: obj.key,
  })
end

请注意,bucket下的所有“foo/*”都将被删除。

如果您想使用Java AWS SDK 2.0删除所有前缀为“foo/”的对象

import java.util.ArrayList;
import java.util.Iterator;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;

//...

ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder()
    .bucket(bucketName)
    .prefix("foo/")
    .build()
;
ListObjectsResponse objectsResponse = s3Client.listObjects(listObjectsRequest);

while (true) {
    ArrayList<ObjectIdentifier> objects = new ArrayList<>();

    for (Iterator<?> iterator = objectsResponse.contents().iterator(); iterator.hasNext(); ) {
        S3Object s3Object = (S3Object)iterator.next();
        objects.add(
            ObjectIdentifier.builder()
                .key(s3Object.key())
                .build()
        );
    }

    s3Client.deleteObjects(
        DeleteObjectsRequest.builder()
            .bucket(bucketName)
            .delete(
                Delete.builder()
                    .objects(objects)
                    .build()
            )
            .build()
    );

    if (objectsResponse.isTruncated()) {
        objectsResponse = s3Client.listObjects(listObjectsRequest);
        continue;
    }

    break;
};
import java.util.ArrayList;
导入java.util.Iterator;
导入software.amazon.awssdk.services.s3.S3Client;
导入software.amazon.awssdk.services.s3.model.*;
//...
ListObjectsRequest ListObjectsRequest=ListObjectsRequest.builder()
.bucket(bucketName)
.前缀(“foo/”)
.build()
;
ListObjectsResponse objectsResponse=s3Client.listObjects(listObjectsRequest);
while(true){
ArrayList对象=新的ArrayList();
for(Iterator Iterator=objectsResponse.contents().Iterator();Iterator.hasNext();){
S3Object S3Object=(S3Object)迭代器.next();
objects.add(
ObjectIdentifier.builder()
.key(s3Object.key())
.build()
);
}
s3Client.deleteObjects(
DeleteObjectsRequest.builder()
.bucket(bucketName)
.删除(
Delete.builder()
.对象(对象)
.build()
)
.build()
);
if(objectsResponse.isTruncated()){
objectsResponse=s3Client.listObjects(listObjectsRequest);
继续;
}
打破
};

投票通过的答案缺少一个步骤

根据aws s3帮助:

目前,不支持在应用程序中使用UNIX样式的通配符 命令的路径参数。但是,大多数命令都有
--exclude”“
--include”“
参数,可以实现 期望的结果。。。。。。。。。当有多个 过滤器,规则是稍后在命令take中出现的过滤器 优先于在命令前面出现的过滤器。例如,如果传递给命令的筛选器参数为
--exclude“*”
--include“*.txt”
则除了结束的文件之外,所有文件都将从命令中排除 with.txt


在S3管理控制台中,单击bucket的复选标记,然后单击顶部r的empty按钮
s3.list_objects(bucket: bucket_name, prefix: "foo/").contents.each do |obj|
  next if obj.key == "foo/" 
  resp = s3.delete_object({
    bucket: bucket_name,
    key: obj.key,
  })
end
import java.util.ArrayList;
import java.util.Iterator;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;

//...

ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder()
    .bucket(bucketName)
    .prefix("foo/")
    .build()
;
ListObjectsResponse objectsResponse = s3Client.listObjects(listObjectsRequest);

while (true) {
    ArrayList<ObjectIdentifier> objects = new ArrayList<>();

    for (Iterator<?> iterator = objectsResponse.contents().iterator(); iterator.hasNext(); ) {
        S3Object s3Object = (S3Object)iterator.next();
        objects.add(
            ObjectIdentifier.builder()
                .key(s3Object.key())
                .build()
        );
    }

    s3Client.deleteObjects(
        DeleteObjectsRequest.builder()
            .bucket(bucketName)
            .delete(
                Delete.builder()
                    .objects(objects)
                    .build()
            )
            .build()
    );

    if (objectsResponse.isTruncated()) {
        objectsResponse = s3Client.listObjects(listObjectsRequest);
        continue;
    }

    break;
};
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"