[amazon-s3] S3 버킷에서 파일을 재귀 적으로 삭제하는 방법

S3에는 다음과 같은 폴더 구조가 있습니다. 특정 폴더 아래의 모든 파일을 재귀 적으로 제거하는 방법이 있습니까 (예 : foo/bar1 or foo or foo/bar2/1..)

foo/bar1/1/..
foo/bar1/2/..
foo/bar1/3/..

foo/bar2/1/..
foo/bar2/2/..
foo/bar2/3/..



답변

최신 aws-cli python 명령 줄 도구 를 사용하여 버킷의 폴더 아래에있는 모든 파일을 재귀 적으로 삭제하는 방법은 다음과 같습니다.

aws s3 rm --recursive s3://your_bucket_name/foo/

또는 버킷 아래의 모든 항목을 삭제합니다.

aws s3 rm --recursive s3://your_bucket_name

원하는 것이 실제로 버킷을 삭제하는 것이라면 한 단계 바로 가기가 있습니다.

aws s3 rb --force s3://your_bucket_name

해당 버킷의 콘텐츠를 재귀 적으로 제거한 다음 버킷을 삭제합니다.

참고 : s3://이러한 명령이 작동 하려면 프로토콜 접두사가 필요합니다.


답변

이전에는 키 (파일) 당 전용 API 호출이 필요했지만 2011 년 12 월 에 Amazon S3-Multi-Object Delete 가 도입되어 크게 단순화되었습니다 .

Amazon S3의 새로운 다중 객체 삭제는 단일 요청으로 S3 버킷에서 최대 1000 개의 객체를 삭제할 수있는 기능을 제공합니다.

이에 대한 자세한 내용과 PHP의 각 예제는 와일드 카드사용하여 api php를 사용하여 S3에서 삭제 하는 관련 질문에 대한 내 답변을 참조하십시오 ( PHP 용 AWS SDK는 버전 1.4.8 부터이를 지원함 ).

한편 대부분의 AWS 클라이언트 라이브러리는이 기능에 대한 전담 지원을 도입했습니다. 예 :

파이썬

대략 다음과 같이 AWS에 대한 뛰어난 boto Python 인터페이스를 사용하여이를 달성 할 수 있습니다 (머리 위에서부터).

import boto
s3 = boto.connect_s3()
bucket = s3.get_bucket("bucketname")
bucketListResultSet = bucket.list(prefix="foo/bar")
result = bucket.delete_keys([key.name for key in bucketListResultSet])

루비

때문에 사용할 수 있습니다 버전 1.24루비 AWS SDK 및 릴리스 노트는 예를뿐만 아니라 제공 :

bucket = AWS::S3.new.buckets['mybucket']

# delete a list of objects by keys, objects are deleted in batches of 1k per
# request.  Accepts strings, AWS::S3::S3Object, AWS::S3::ObectVersion and 
# hashes with :key and :version_id
bucket.objects.delete('key1', 'key2', 'key3', ...)

# delete all of the objects in a bucket (optionally with a common prefix as shown)
bucket.objects.with_prefix('2009/').delete_all

# conditional delete, loads and deletes objects in batches of 1k, only
# deleting those that return true from the block
bucket.objects.delete_if{|object| object.key =~ /\.pdf$/ }

# empty the bucket and then delete the bucket, objects are deleted in batches of 1k
bucket.delete!

또는:

AWS::S3::Bucket.delete('your_bucket', :force => true)


답변

Amazon S3 수명주기를 사용하여 접두사가있는 파일에 대한 만료를 생성 할 수도 있습니다 foo/bar1.

S3 브라우저 콘솔을 열고 버킷을 클릭합니다. 그런 다음 속성을 클릭 한 다음 LifeCycle을 클릭합니다.

접두사가있는 모든 파일에 대한 만료 규칙을 foo/bar1만들고 파일이 생성 된 후 날짜를 1 일로 설정합니다.

저장하면 일치하는 모든 파일이 24 시간 이내에 사라집니다.

완료 한 후에는 규칙을 제거하는 것을 잊지 마십시오!

API 호출, 타사 라이브러리, 앱 또는 스크립트가 없습니다.

이런 식으로 수백만 개의 파일을 삭제했습니다.

수명주기 규칙 창을 보여주는 스크린 샷 (이 샷에서는 접두사가 비어있어 버킷의 모든 키에 영향을 미침) :

여기에 이미지 설명 입력


답변

함께 s3cmd패키지는 리눅스 시스템에 설치, 당신은이 작업을 수행 할 수 있습니다


s3cmd rm s3://foo/bar --recursive


답변

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;
};


답변

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

주의하시기 바랍니다, 버킷 아래의 모든 “foo / *”가 삭제됩니다.


답변

PowerShell을 사용하여 버킷에서 모든 파일을 제거했습니다.

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