如何通过AWS CLI仅同步S3中最新上传的文件至Windows本地?
解决S3 Sync仅同步新增文件(避免重复拉取已删除旧文件)
方案一:Windows PowerShell + AWS CLI实现精准时间筛选
这是最贴合需求的方案,用PowerShell替代Linux的awk/管道命令处理时间逻辑,无需额外服务:
初始化同步时间记录
第一次运行时,创建记录上次同步时间的文件:Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ" | Out-File -FilePath "C:\your-path\last_sync_time.txt" -Encoding utf8编写同步脚本
创建PowerShell脚本Sync-S3-NewFiles.ps1,内容如下:# 读取上次同步时间 $lastSyncTime = Get-Content -Path "C:\your-path\last_sync_time.txt" -Raw | Trim # 筛选S3中data1/前缀下,晚于上次同步时间的文件 $newFiles = aws s3api list-objects-v2 --bucket bucket-name --prefix data1/ --query "Contents[?LastModified > '$lastSyncTime'].Key" --output text # 同步符合条件的新文件到本地 if ($newFiles) { foreach ($file in $newFiles -split "`t") { # 移除S3前缀,保持本地文件结构一致 $localPath = "E:\Datafolder\" + $file.Replace("data1/", "") aws s3 cp "s3://bucket-name/$file" $localPath } } # 更新同步时间为当前时间 Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ" | Out-File -FilePath "C:\your-path\last_sync_time.txt" -Encoding utf8配置任务计划程序
在任务计划程序中设置执行命令:powershell -ExecutionPolicy Bypass -File "C:\your-path\Sync-S3-NewFiles.ps1"每次执行只会同步上次同步之后新增的文件,本地删除旧文件也不会重新拉取。
方案二:修改EC2上传逻辑,按日期分目录同步
通过给上传文件按日期分类,Windows端只同步当日目录,彻底避免旧文件干扰:
修改EC2的cron命令
每天上传的文件放到对应日期的子目录下:DATE=$(date +%Y-%m-%d) aws s3 mv --recursive localdir s3://bucket-name/data1/$DATE/ --exclude "*" --include "localdir/*"Windows端bat脚本
编写sync_s3.bat,自动同步当日目录:@echo off :: 获取当前日期,格式YYYY-MM-DD for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set "DATE=%%c-%%a-%%b" aws s3 sync s3://bucket-name/data1/%DATE%/ E:\Datafolder\同样通过任务计划程序执行该bat文件即可。
方案三:Lambda备选方案(仅当CLI方案不适用时考虑)
如果需要更自动化的触发(比如文件上传后立即同步),可以用Lambda:
- 给S3桶配置
s3:ObjectCreated:*触发事件,当有新文件上传时触发Lambda - 在Lambda中调用Windows机器的下载接口(比如通过SMB、API网关触发本地脚本),或者直接生成预签名URL让Windows端拉取新文件
- 该方案复杂度更高,需要额外配置权限和网络,优先推荐前两种CLI方案
内容的提问来源于stack exchange,提问作者rocky_alpine
相关产品推荐
相关产品推荐

