Amazon S3 Boto-폴더를 삭제하는 방법?


87

s3에 "test"라는 폴더를 만들고 "test_1.jpg", "test_2.jpg"를 "test"에 푸시했습니다.

boto를 사용하여 "test"폴더를 삭제하려면 어떻게해야합니까?


1
@pyCthon 잘못된 기술입니다. 다시 시도하십시오.
devinbost

답변:


61

S3 에는 폴더 가 없습니다 . 대신 키는 플랫 네임 스페이스를 형성합니다. 그러나 이름에 슬래시가있는 키는 AWS 콘솔을 포함한 일부 프로그램에서 특별히 표시됩니다 (예 : Amazon S3 boto-폴더 생성 방법 참조 ).

"디렉토리"를 삭제하는 대신 접두사별로 파일을 나열하고 삭제해야합니다. 본질적으로:

for key in bucket.list(prefix='your/directory/'):
    key.delete()

그러나이 페이지의 다른 완성 된 답변은보다 효율적인 접근 방식을 제공합니다.


접두사는 더미 문자열 검색을 사용하여 검색됩니다. 접두사가 your/directory이면, 즉 후행 슬래시가 추가되지 않은 경우 프로그램은 your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one.

자세한 내용은 S3 boto 목록 키가 때때로 디렉터리 키를 반환 함을 참조하십시오 .


1
디렉토리를 삭제하는 방법? 이 디렉토리의 모든 파일이 삭제 될 때이 디렉토리가 자동으로 삭제된다면?
wade huang

당신은 ... 나는 ~을 완료 한 감사합니다
황 웨이드

@wadehuang-폴더 삭제에 대한 코드를 공유 할 수 있습니까?
letsc

파이썬에서 2 일이 지난 s3 폴더의 파일을 삭제하는 방법. 내 S3이 있습니다 - 통 / 1 / 백업 / (10 개 파일) 이일 된 모든 파일을 제거해야하는
艾瑪艾瑪艾瑪

185

다음은 2018 (거의 2019) 버전입니다.

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()

22
이것이 가장 좋은 대답입니다.
user554481

1
누군가는 bucket.objects.all (). delete ()가 얼마나 많은 객체가 있든 상관없이 전체 버킷을 삭제하지 않고 비운다는 것을 아는 것이 유용 할 수 있습니다 (즉, 영향을받지 않지만 1000 개 항목 제한). 참조 : boto3.amazonaws.com/v1/documentation/api/latest/reference/…
fabiog

1
안녕 Raz 이것은 나를 위해 작동하지 않습니다, 나는 단순히 빈 대괄호, 즉 []
Soyf dec

슬프게도 이것은 Suffix를 지원하지 않습니다 :(
Anum Sheraz

의 좋은 점은이 솔루션도 1000 개 이상의 객체와 함께 작동한다는 것입니다
마빈

45

오랜만이고 boto3는이 목표를 달성하는 몇 가지 방법이 있습니다. 테스트 "폴더"및 모든 해당 개체 를 삭제하려는 경우 한 가지 방법이 있습니다.

s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")

delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]

s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)

이것은 두 개의 요청을 만들어야합니다. 하나는 폴더의 개체를 가져 오는 것이고 다른 하나는 해당 폴더의 모든 개체를 삭제하는 것입니다.

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects


이것은 가장 빠른 솔루션입니다.
deepelement

2
이것은 가장 빠른 솔루션이지만 list_objects1000 개가 넘는 키를 반환 할 수 없으므로이 코드를 여러 번 실행해야합니다.
lampslave

4
1k 개 이상의 개체가있는 경우 페이지 매기기를 사용할 수 있습니다. 아래 내 답변을 참조하십시오.
dmitrybelyakov 2011

@deepelement, 그리고 그것은 단지 작동 boto3하지 BOTO,
아보카도

1
이것은 훌륭하게 작동하며 위의 코드를 lambda_handler 함수에 넣어 Python 람다에서 실행할 수 있습니다 import boto3; def lambda_handler(event, context): '''Code from above'''. Lambda에 S3에서 삭제하고 제한 시간을 연장 할 수있는 권한을 부여했는지 확인하십시오.
Nadir Sidi

21

키 목록과 함께 bucket.delete_keys () 를 사용할 수 있습니다 ( 키가 많으면 key.delete를 사용하는 것보다 훨씬 빠릅니다).

이 같은:

delete_key_list = []
for key in bucket.list(prefix='/your/directory/'):
    delete_key_list.append(key)
    if len(delete_key_list) > 100:
        bucket.delete_keys(delete_key_list)
        delete_key_list = []

if len(delete_key_list) > 0:
    bucket.delete_keys(delete_key_list)

20

Patrick의 솔루션에 대한 약간의 개선. 아시다시피, 둘 다 list_objects()delete_objects()개체 제한은 1000입니다. 이것이 목록을 페이지로 매기고 청크로 삭제해야하는 이유입니다. 이것은 매우 보편적이고 당신은 줄 수 Prefixpaginator.paginate()삭제 하위 디렉토리 / 경로에

client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)

delete_us = dict(Objects=[])
for item in pages.search('Contents'):
    delete_us['Objects'].append(dict(Key=item['Key']))

    # flush once aws limit reached
    if len(delete_us['Objects']) >= 1000:
        client.delete_objects(Bucket=bucket, Delete=delete_us)
        delete_us = dict(Objects=[])

# flush rest
if len(delete_us['Objects']):
    client.delete_objects(Bucket=bucket, Delete=delete_us)

2
"디렉토리"로 제한하려면 모든 옵션보기 : boto3.readthedocs.io/en/latest/reference/services/…Prefix 에서 키워드를 사용 paginator.paginate()하십시오.
Chad

1
Prefix의해 제안 필터 @Chad , 내가 추가 할 수 없었다 if item is not None(어떤 물체도 / 내 S3 접두사의 일부가 존재하지 않았기 때문에이 있었다) 삭제하기 전에 확인
Y2K-하기 Shubham을

1

S3 버킷에서 버전 관리가 활성화 된 경우 :

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.