我正在尝试将基于上次修改的最新文件从 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 中删除除最新文件之外的所有其他文件?
您要扫描多少个文件?
如果是 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 是为了处理非常大的存储桶。
我能够让它工作,但它需要一些与 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
命令已安装。
此命令将列出给定前缀的“最新”对象:
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 脚本来实现您的目标可能会更容易。