首页 文章

Amazon S3递归删除子文件夹

提问于
浏览
0

我有一个带有嵌套文件夹和文件结构的S3存储桶 . 我知道S3有一个扁平的概念,但在我清楚地陈述我的问题时请耐心等待 .

我想这样做:

delete bucket/do-not-delete-folder/delete-this-folder-recursively

我已经倾注了S3文档,并按照python - Amazon S3 boto - how to delete folder? - Stack Overflow给出的答案 .

我尝试了两种不同的解决方案,它们产生了两种不同的输出,你猜对了,没有人做我想做的事情 .

Function 1:

这会以递归方式删除“do-not-delete-folder”及其所有内容 . 我只想删除子文件夹而不是顶级文件夹 .

我用以下参数称之为:

DeleteAWSBucketObjects(my-bucket, do-not-delete-folder/delete-this-folder/)

功能是:

def DeleteAWSBucketObjects(bucketName, prefixStr):

    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucketName)

    try:
        client = boto3.client('s3')
        response = client.list_objects_v2(Bucket=bucketName, Prefix=prefixStr)
        if 'Contents' in response:
            for item in response['Contents']:
                while response['KeyCount'] == 1000:
                    response = client.list_objects_v2(Bucket=bucketName,
                                StartAfter=response['Contents'][0]['Key'],)
                    for item in response['Contents']:
                        client.delete_object(Bucket=bucketName, Key=item['Key'])
    except ClientError as e:
        error_code = int(e.response['Error']['Code'])
        print ("DeleteAWSBucketObjects : hit an exception")
        print (error_code)

    return

Function 2:

取自上面提到的链接 . 我用与上面提到的相同的参数来称呼它 .

奇怪的是,这导致 Access-denied 错误 . 我'm running it from within the same code-file in Lambda and same AWS accounts, so I'我不确定为什么一个版本的函数删除所有内容而另一个版本没有删除任何内容的权限 .

DeleteAWSBucketObjectsV2(my-bucket, do-not-delete-folder/delete-this-folder/)

功能:

def DeleteAWSBucketObjectsV2(bucketName, prefixStr):

    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucketName)
    objects_to_delete = s3.meta.client.list_objects(Bucket=bucketName, Prefix=prefixStr)

    delete_keys = {'Objects' : []}
    delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]
    for i in delete_key:
        print("delete_key_array !!!")
        print(str(i))
    try:
        s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)
    except ClientError as e:
        error_code = int(e.response['Error']['Code'])
        print ("DeleteAWSBucketObjects : hit an exception")
        print (error_code)

1 回答

  • 0

    我从你的问题中理解的是,你想删除名为 delete-this-folder 的子文件夹,所以这是一个简单的方法:

    import boto3
    s3 = boto3.resource('s3')
    bucket=s3.Bucket('mausamrest');
    obj = s3.Object('mausamrest','do-not-delete-folder/delete-this-folder/')
    counter=-1
    
    
    for obj in bucket.objects.filter(Prefix='do-not-delete-folder/delete-this-folder/'):
        print(obj.key)
        try:
            obj.delete()
            counter=counter+1
        except:
            print("error occurred while deleting")
    
    if(counter==-1):
        print("subfolder doesn't exists")
    if(counter!=-1):
        print("1 subfolder and "+str(counter)+" items in it deleted")
    

    这里 mausamrest 是桶名, do-not-delete-folder/delete-this-folder/ 是子目录

相关问题