首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从超过X天的S3桶中删除文件夹、子文件夹和所有文件

从超过X天的S3桶中删除文件夹、子文件夹和所有文件
EN

Stack Overflow用户
提问于 2019-08-23 07:23:47
回答 3查看 2.7K关注 0票数 1

我有一个具有以下架构的S3桶-

代码语言:javascript
代码运行次数:0
运行
复制
Bucket
|__2019-08-23/
|   |__SubFolder1
|      |__Files
|
|__2019-08-22/
   |__SubFolder2

我想要删除所有文件夹,子文件夹和文件,其中是旧的X天。

怎样才能做到呢?我不确定S3 LifeCycle是否可以用于此?

当我做的时候-

代码语言:javascript
代码运行次数:0
运行
复制
aws s3 ls s3://bucket/

我明白了-

代码语言:javascript
代码运行次数:0
运行
复制
PRE 2019-08-23/
PRE 2019-08-22/

为什么我在文件夹名前面看到了PRE?

根据有价值的评论,我试过这个-

代码语言:javascript
代码运行次数:0
运行
复制
$ Number=1;current_date=$(date +%Y-%m-%d);
past_date=$(date -d "$current_date - $Number days" +%Y-%m-%d);
aws s3api list-objects --bucket bucketname --query 'Contents[?LastModified<=$past_date ].{Key:Key,LastModified: LastModified}' --output text |  xargs -I {} aws  s3 rm bucketname/{}

我试图删除所有的文件,其中有一天。但我知道这个错误-

代码语言:javascript
代码运行次数:0
运行
复制
Bad jmespath expression: Unknown token $:
Contents[?LastModified<=$past_date ].{Key:Key,LastModified: LastModified}

如何以最后修改的方式传递变量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-23 08:53:50

如果您有更复杂的逻辑或命令行,可以使用生命周期,即lambda函数。

下面是一个使用命令行的示例:

代码语言:javascript
代码运行次数:0
运行
复制
aws s3api list-objects --bucket your-bucket --query 'Contents[?LastModified>=`2019-01-01` ].{Key:Key,LastModified: LastModified}' --prefix "2019-01-01" --output text |  xargs -I {} aws  s3 rm s3://your-bucket/{}   
票数 4
EN

Stack Overflow用户

发布于 2019-08-23 08:50:20

@Elzo的回答已经涵盖了生命周期策略以及如何删除对象,因此,在这里,我对您问题的第二部分有一个答案:

PRE表示前缀,如aws s3 cli手册中所述。

如果您运行aws s3 ls help,您将看到以下部分:

下面的ls命令在指定的桶和前缀下列出对象和常见前缀。在本例中,用户拥有带有test.txt和somePrefix/test.txt对象的存储桶。最后一个- WriteTime和长度是任意的.请注意,由于ls命令与本地文件系统没有交互,解决歧义不需要s3:// URI方案,因此可以省略: aws s3 ls ss3://mybucket输出: PRE / 2013-07-25 17:06:27 88 test.txt

这只是为了区分具有前缀(由正斜杠拆分)的键和没有前缀的键。

因此,如果您的密钥是prefix/key01,您将始终在它前面看到一个PRE。但是,如果您的键是key01,则不会显示PRE

请记住,S3不与目录一起工作,即使您可以在从UI中查看时知道其他情况。S3的文件结构只是一个平面的单层文件容器。

从医生那里:

在亚马逊S3中,桶和对象是主要资源,其中对象存储在存储桶中。亚马逊S3有一个平面结构,没有像你在文件系统中看到的那样的层次结构。但是,为了组织简单起见,Amazon控制台支持将文件夹概念作为对象分组的一种方式。亚马逊S3通过使用对象的共享名称前缀(即以公共字符串开头的名称的对象)来实现这一点。对象名称也称为键名。 例如,您可以在控制台中创建一个名为“照片”的文件夹,并在其中存储一个名为myphoto.jpg的对象。然后,将该对象存储在键名/myphoto.jpg中,而照片/是前缀。

票数 0
EN

Stack Overflow用户

发布于 2019-08-23 08:39:58

S3生命周期可以用于存储桶。对于文件夹和子文件夹管理,您可以编写一个简单的AWS来删除xx天前的文件夹和子文件夹。利用S3 AWS为JavaScript、Java或Python等开发Lambda。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57621572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档