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://
이러한 명령이 작동 하려면 프로토콜 접두사가 필요합니다.
rm
파일 만 삭제하지만 rb --force
파일 과 버킷 은 삭제합니다 .
--recursive
하면 폴더도 삭제됩니다.
이전에는 키 (파일) 당 전용 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
Amazon S3 수명주기를 사용하여 접두사가있는 파일에 대한 만료를 생성 할 수도 있습니다 foo/bar1
.
S3 브라우저 콘솔을 열고 버킷을 클릭합니다. 그런 다음 속성을 클릭 한 다음 LifeCycle을 클릭합니다.
접두사가있는 모든 파일에 대한 만료 규칙을 foo/bar1
만들고 파일이 생성 된 후 날짜를 1 일로 설정합니다.
저장하면 일치하는 모든 파일이 24 시간 이내에 사라집니다.
완료 한 후에는 규칙을 제거하는 것을 잊지 마십시오!
API 호출, 타사 라이브러리, 앱 또는 스크립트가 없습니다.
이런 식으로 수백만 개의 파일을 삭제했습니다.
수명주기 규칙 창을 보여주는 스크린 샷 (이 샷에서는 접두사가 비어있어 버킷의 모든 키에 영향을 미침) :
함께 s3cmd
패키지는 리눅스 시스템에 설치, 당신은이 작업을 수행 할 수 있습니다
s3cmd rm s3://foo/bar --recursive
s3cmd del s3://BUCKET/OBJECT
또는 전체 버킷 삭제 s3cmd rb s3://BUCKET
입니다. s3cmd rm
적어도에 따르면 없다 s3cmd --help
.
s3cmd rm
(del의 별칭으로) 2019 년 현재 도움말에 있습니다. 이것은 훌륭한 답변입니다. aws
CLI 도구 만에 대한 작업 /
두 경우 모두 s3cmd 작품 반면 종료 접두사가 아니라 폴더와 파일 이름의 일부 접두사. 이 답변에는 더 많은 upvotes가 필요하며 올바른 솔루션을 찾기 위해 너무 많이 스크롤해야했습니다.
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;
};
PowerShell을 사용하여 버킷에서 모든 파일을 제거했습니다.
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
Amazon이 AWS 콘솔 메뉴에 "버킷을 비우는 방법"옵션을 추가 한 것을 확인했습니다.
http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html
투표 된 답변에 단계가 없습니다.
aws s3 도움말에 따라 :
현재는 명령의 경로 인수에서 UNIX 스타일 와일드 카드 사용을 지원하지 않습니다. 그러나 대부분의 명령에는 원하는 결과를 얻을 수 있는
--exclude "<value>"
및--include "<value>"
매개 변수가 있습니다 .... 여러 필터가있는 경우 명령의 뒷부분에 나타나는 필터가 명령의 앞부분에 나타나는 필터보다 우선합니다. 예를 들어, 명령에 전달 된 필터 매개 변수--exclude "*"
--include "*.txt"
가 .txt로 끝나는 파일을 제외한 모든 파일이 명령에서 제외됩니다.
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"
가장 좋은 방법은 수명주기 규칙을 사용하여 전체 버킷 콘텐츠를 삭제하는 것입니다. 프로그래밍 방식으로 다음 코드 (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);
다음을 수행해야했습니다 ...
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