当前位置: 首页 > 知识库问答 >
问题:

从AWS S3 CLI获取上次修改的对象

扈运浩
2023-03-14

我试图复制最新的文件基于最后修改从AWS S3Folder_Test1文件夹到一个Folder_Test2文件夹在同一个桶中,并在复制命令中使用排除和包括。

Folder_Test1:

Name                               Last Modified
T1_abc_june21.csv                  June 21,2020 9:27:03 AM GMT-0700
T1_abc_june21.csv                  June 21,2020 7:40:15 PM GMT-0700
T1_abc_june21.csv                  June 21,2020 9:20:32 PM GMT-0700
T1_abc_june25.csv                  June 25,2020 10:23:30 PM GMT-0700
T2_abc_june29.csv                  June 29,2020 6:15:12 AM GMT-0700
T2_abc_june29.csv                  June 29,2020 5:12:15 PM GMT-0700 (Fetch this object)
T1_abc_def_june21.csv              June 21,2020 6:13:15 PM GMT-0700
T2_abc_def_june25.csv              June 25,2020 5:33:10 AM GMT-0700
T3_abc_def_june25.csv              June 25,2020 9:31:15 PM GMT-0700 (Fetch this object)

我必须过滤文件名只有最新的文件abc和排除复制文件:

我尝试:步骤1复制abc文件从Folder_Test1到Folder_Test2:

aws s3 cp  s3://$bucket/Folder_Test1/ s3://$bucket/Folder_Test2/ --recursive --exclude "*abc_def*"

步骤2它将获取最新的abc文件从Folder_Test2:

aws s3 ls  s3://$bucket/Folder_Test2/ --recursive | sort | tail -n 1 | awk '{print $4}'

如何将最新文件从文件夹_Test2复制到文件夹_Test3?或者如何从文件夹_Test2中删除除最新文件之外的所有其他文件?

共有3个答案

卫仲卿
2023-03-14

你扫描了多少文件?

如果它是100,000或更多,你可能想使用比AWS-cli更快的东西。S3P使用并行列表算法将S3桶列表加速10倍以上。

你只需要安装NodeJs。然后使用以下命令运行s3p:

npx s3p map \
  --bucket  my-bucket \
  --prefix  Folder_Test1/ \
  --reduce  "js:(a, b) => a.LastModified > b.lastModified ? a : b" \
  --finally "js:({Key}) => Key"

这将输出Folder_Test1/中最近修改的文件的密钥。

更多信息:

  • 套餐:https://www.npmjs.com/package/s3p
  • Github:https://github.com/generalui/s3p

免责声明:我写S3P是为了处理非常大的桶。

宰父俊彦
2023-03-14

此命令将列出给定前缀的“最新”对象:

aws s3api list-objects --bucket MY-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text

您可以将其与“复制”命令结合使用:

key=$(aws s3api list-objects --bucket SOURCE-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text)
aws s3 cp s3://SOURCE-BUCKET/$key s3://DEST-BUCKET/

--query参数非常强大。请参阅:JMESPath教程

但是,列表对象命令不能与-包括/-排除组合。

坦率地说,编写一个小型Python脚本来实现您的目标可能会更容易。

酆恩
2023-03-14

我能够让这个工作,但它需要一些shell相关的代码和jq。在Linux的环境中,我能够做这样的事情:

aws s3 cp s3://$bucket/`aws s3api list-objects-v2 --bucket $bucket --prefix Folder_Test1/ | jq -r '.[] | sort_by(.LastModified)[-1].Key'` $bucket/Folder_Test2/

这有什么用?第一部分查找本例中以“Folder_Test1/”开头的最新文件:

aws s3api list-objects-v2 --bucket $bucketsource --prefix Folder_Test1/ | jq -r '.[] | sort_by(.LastModified)[-1].Key'

然后我们将这个输出传递到jq,让它按最后修改字段排序,并获得该项的密钥。请注意,这是使用s3api,以便我们可以读取原始JSON。

一旦我们有了它,我们就使用这个输出作为cp命令的输入。

这是在Ubuntu系统上用AWS CLI(2.0.30)的V2测试的。jq命令已经安装。

 类似资料:
  • 我有一个用例,在这个用例中,我以编程方式启动一个EC2实例,从S3复制一个可执行文件,运行它并关闭实例(在用户数据中完成)。我只需要从S3获取最后添加的文件。 有没有办法使用AWS CLI工具从S3存储桶中获取上次修改的文件/对象?

  • 问题内容: 有什么标准的方法可以告诉您页面的最后修改时间?目前,我正在这样做: 但是,看起来有些站点没有字段。 http://www.cbc.ca具有以下标头字段: 我可以解析页面以尝试获取其日期,但这似乎是一个很大的痛苦。标准是什么? (如果可能的话,我想坚持使用URLConnection,因为那是我用来下载网页的方法) 问题答案: 没有标准。动态生成的网页通常没有“ Last- Modifie

  • 有什么想法可以解决这个问题吗?谢谢。

  • 问题内容: 在具有新I / O API的Java7中,是否有一种简便的方法可以按上次修改日期列出目录的内容?基本上,我只需要获取未修改时间最长的文件(按最后修改的升序排序,采用第一个文件名)。 问题答案: 并没有真正的“简便方法”,但是有可能: 这将对文件排序最快,最后修改的文件最后排序。s不会遍历子目录。

  • 我有一个Azure Blob存储安装到我的Database ricks hdfs。有没有办法在数据库中获取Blob的最后修改日期? 这就是我阅读blob内容的方式:

  • 我需要获取Azure Databricks下DBFS装载点(ADLS Gen1)中所有文件夹和文件的最后修改日期。文件夹结构如下: 使用以下Python代码获取最后修改日期: 从上面的代码中,我得到了所有包含文件的文件夹的正确修改日期。 但对于空文件夹,它会给出当前日期。不是上次修改日期。 然而,当我硬编码空文件夹的路径时,它会给出正确的修改日期: 打印(datetime.fromtimestam