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 }