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에서 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 호출, 타사 라이브러리, 앱 또는 스크립트가 없습니다.
이런 식으로 수백만 개의 파일을 삭제했습니다.
수명주기 규칙 창을 보여주는 스크린 샷 (이 장면에서는 접두사가 비어있어 버킷의 모든 키에 영향을 미침) :
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;
};
함께 s3cmd
패키지는 리눅스 시스템에 설치, 당신은이 작업을 수행 할 수 있습니다
s3cmd rm s3://foo/bar --recursive
PowerShell을 사용하여 버킷에서 모든 파일을 제거했습니다.
Get-S3Object -BucketName YOUR_BUCKET | % { Remove-S3Object -BucketName YOUR_BUCKET -Key $_.Key -Force:$true }
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 / *"가 삭제됩니다.
Amazon이 AWS 콘솔 메뉴에 "버킷을 비우는 방법"옵션을 추가 한 것을 확인했습니다.
http://docs.aws.amazon.com/AmazonS3/latest/UG/DeletingaBucket.html
가장 좋은 방법은 수명주기 규칙을 사용하여 전체 버킷 콘텐츠를 삭제하는 것입니다. 프로그래밍 방식으로 다음 코드 (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 자정"에서 삭제됩니다.
You can also specify Days as follows. But with Days it will wait for at least 24 hrs (1 day is minimum) to start deleting the bucket contents.
$expiration = array('Days' => 1);
I needed to do the following...
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
The voted up answer is missing a step.
Per aws s3 help:
Currently, there is no support for the use of UNIX style wildcards in a command's path arguments. However, most commands have
--exclude "<value>"
and--include "<value>"
parameters that can achieve the desired result......... When there are multiple filters, the rule is the filters that appear later in the command take precedence over filters that appear earlier in the command. For example, if the filter parameters passed to the command were--exclude "*"
--include "*.txt"
All files will be excluded from the command except for files ending with .txt
aws s3 rm --recursive s3://bucket/ --exclude="*" --include="/folder_path/*"
참고URL : https://stackoverflow.com/questions/10054985/how-to-delete-files-recursively-from-an-s3-bucket
'code' 카테고리의 다른 글
Android에서 선형 레이아웃 주위에 그림자를 표시하는 방법은 무엇입니까? (0) | 2020.10.20 |
---|---|
자바에서 상대 경로로 리소스 열기 (0) | 2020.10.20 |
고 루틴 스택 트레이스를 덤프하는 방법은 무엇입니까? (0) | 2020.10.20 |
Windows Server 2008 (64 비트)에서 wcf 서비스를 검색하는 동안 "HTTP 오류 404.3-찾을 수 없음" (0) | 2020.10.20 |
Android 스튜디오에서 buildToolsVersion '23 .0.1 '을 업데이트 한 후 메모리 부족 문제 (0) | 2020.10.20 |