提问人:rocky_alpine 提问时间:12/16/2022 最后编辑:rocky_alpine 更新时间:12/20/2022 访问量:672
将最新上传的文件从 S3 存储桶复制到本地计算机
Copy the latest uploaded file from S3 bucket to local machine
问:
我有一个 cron 作业集,用于将文件从 EC2 实例移动到 S3
aws s3 mv --recursive localdir s3://bucket-name/ --exclude "*" --include "localdir/*"
之后,我在 .bat 文件中使用并在 Windows 中运行任务计划程序来运行该命令。aws s3 sync s3://bucket-name/data1/ E:\Datafolder
问题是 s3 sync 命令复制了前缀中的所有文件。/data1/
因此,假设我有以下文件:
Day1:file1 同步到本地。 第 2 天:file1 和 file2 已同步到本地,因为 file1 已从本地计算机的文件夹中删除。
我不希望它们在本地机器上占用空间。在第 2 天,我只想复制 file2。
这可以通过 AWS CLI 命令完成吗?还是我需要编写 lambda 函数?
我遵循了使用 AWS CLI 从 S3 获取最后修改的对象中的答案
但在 Windows 上,和命令未按预期工作。|
awk
答:
1赞
John Rotenstein
12/16/2022
#1
若要获取具有最近“上次修改”日期的对象的名称,可以使用:
aws s3api list-objects-v2 --bucket BUCKET-NAME --query 'sort_by(Contents, &LastModified)[-1].Key' --output text
因此(使用 shell 语法),您可以使用:
object=`aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text`
aws s3 cp s3://BUCKET-NAME/$object E:\Datafolder
您可能需要对其进行调整才能使其在 Windows 上运行。
基本上,它获取存储桶列表,按 排序,然后获取列表中最后一个对象的名称。LastModified
评论
0赞
rocky_alpine
12/16/2022
这适用于 AWS CLI v1 吗?这就是我在 Windows Server 上安装它的原因,因为 CLI v2 与 Windows Server 2008 不兼容。
0赞
John Rotenstein
12/16/2022
是的,它应该可以正常工作。
0赞
rocky_alpine
12/17/2022
不,这在 Windows 上不起作用。我收到一个错误:C:Windows \system32\object= 'object' is not recognized as an internal or external command, operatable program or batch file.aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text
1赞
John Rotenstein
12/17/2022
需要使用等效于存储另一个命令结果的 PowerShell。我不是 PowerShell 人员,但查看 Powershell 中将 cmdlet 的结果值存储在变量中 - Stack Overflow 建议您可以在前面使用(带有美元符号)。$object=
-1赞
rocky_alpine
12/20/2022
#2
修改了答案以使用 Windows 文件。使用 Windows cmd.exe.bat
for /f "delims=" %%i in ('aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query "sort_by(Contents, &LastModified)[-1].Key" --output text') do set object=%%i
aws s3 cp s3://BUCKET-NAME/%object% E:\Datafolder
评论
aws s3 sync
--delete
sync