从 AWS S3 CLI 获取最后修改的对象

问题描述 投票:0回答:3

我正在尝试将基于上次修改的最新文件从 AWS S3

Folder_Test1
文件夹复制到同一存储桶中的
Folder_Test2
文件夹,并在复制命令中使用排除和包含。

文件夹_测试1:

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步它将从Folder_Test2获取最新的

abc
文件:

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

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

amazon-web-services amazon-s3 aws-cli
3个回答
2
投票

您要扫描多少个文件?

如果是 100,000 或更多,您可能需要使用比 aws-cli 更快的东西。 S3P使用并行列表算法将S3存储桶列表加速超过10x

您需要安装的是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/
中最近修改的文件的密钥。

更多信息:

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


1
投票

我能够让它工作,但它需要一些与 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
,让它按 LastModified 字段排序并获取该项目的 Key。请注意,这是使用
s3api
,以便我们可以读取原始 JSON。

一旦获得该输出,我们就使用该输出作为

cp
命令的输入。

已在 Ubuntu 系统上使用 AWS CLI V2 (2.0.30) 进行测试。

jq
命令已安装。


1
投票

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

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 教程

但是,

list-objects
命令不能与
--include
/
--exclude
组合使用。

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

© www.soinside.com 2019 - 2024. All rights reserved.