S3 버킷에서 파일을 재귀 적으로 삭제하는 방법


87

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/..

답변:


164

최신 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://이러한 명령이 작동 하려면 프로토콜 접두사가 필요합니다.


2
이것이 답이되어야합니다. 그냥이 질문에 같은 일을 위해 설계 (새 틱) 표준, 강력한 도구입니다
돈 치들

이것은 파일을 잘 삭제하지만 파일을 삭제 한 후 버킷도 삭제하는 것입니다. 내가 놓친 것이 있습니까?
Naveen

1
위에서 말했듯이 @Naveen은 rm파일 만 삭제하지만 rb --force파일 버킷 은 삭제합니다 .
number5

5
를 사용 --recursive하면 폴더도 삭제됩니다.
ryantuck 2016 년

1
@Moseleyi 내가 당신이 실제로 S3 버킷에 빈 폴더를 가질 수 있다고 생각
ryantuck

58

이전에는 키 (파일) 당 전용 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)

새를 사용해야 aws cli아래 @ number5의 대답처럼 docs.aws.amazon.com/cli/latest/reference/s3/rm.html
돈 치들

43

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

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

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

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

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

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

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

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

여기에 이미지 설명 입력


4
일부 삭제 명령 대신 Lifecycle을 사용하는 것이 좋습니다.
xis

정확합니다. S3가 대신 해드립니다.
Ryan

이를 전체 버킷에 적용하여 버킷을 삭제할 수도 있습니다.
Indolering

8

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

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


1
도움말에 따르면 단일 객체 삭제 s3cmd del s3://BUCKET/OBJECT또는 전체 버킷 삭제 s3cmd rb s3://BUCKET입니다. s3cmd rm적어도에 따르면 없다 s3cmd --help.
Paul McMurdie 2015 년

s3cmd rm(del의 별칭으로) 2019 년 현재 도움말에 있습니다. 이것은 훌륭한 답변입니다. awsCLI 도구 만에 대한 작업 /두 경우 모두 s3cmd 작품 반면 종료 접두사가 아니라 폴더와 파일 이름의 일부 접두사. 이 답변에는 더 많은 upvotes가 필요하며 올바른 솔루션을 찾기 위해 너무 많이 스크롤해야했습니다.
David Parks

8

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

1
이 답변보다 Java에 대해 사람들이 싫어하는 부분에 대한 더 자세한 설명을 찾을 수 없습니다.
Jivan

3

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 / *"가 삭제됩니다.


2

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

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

이 답변을 게시 해 주셔서 감사합니다.이 작업을 수행하려고했지만 작동하지 않는 -Key "% _. Key"를 입력했습니다.
Scott Gartner


1

투표 된 답변에 단계가 없습니다.

aws s3 도움말에 따라 :

현재는 명령의 경로 인수에서 UNIX 스타일 와일드 카드 사용을 지원하지 않습니다. 그러나 대부분의 명령에는 원하는 결과를 얻을 수 있는 --exclude "<value>"--include "<value>"매개 변수가 있습니다 .... 여러 필터가있는 경우 명령의 뒷부분에 나타나는 필터가 명령의 앞부분에 나타나는 필터보다 우선합니다. 예를 들어, 명령에 전달 된 필터 매개 변수 --exclude "*" --include "*.txt"가 .txt로 끝나는 파일을 제외한 모든 파일이 명령에서 제외됩니다.

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

0

가장 좋은 방법은 수명주기 규칙을 사용하여 전체 버킷 콘텐츠를 삭제하는 것입니다. 프로그래밍 방식으로 다음 코드 (PHP)를 PUT 수명주기 규칙에 사용할 수 있습니다.

$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 자정"에서 삭제됩니다.

다음과 같이 Days를 지정할 수도 있습니다. 그러나 Days에서는 버킷 콘텐츠 삭제를 시작하기 위해 최소 24 시간 (최소 1 일)을 기다립니다.

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

0

다음을 수행해야했습니다 ...

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.