使用PowerShell删除S3桶14天前文件脚本误删全部文件问题排查
PowerShell S3文件删除脚本错误分析
核心错误点
- 时间比较逻辑反向+时区不匹配
你需要删除早于14天的文件,对应判断逻辑应为文件时间 < 14天前的时间节点,但你过滤用的运算符是-ge(大于等于),反而筛选出了最近14天的文件执行删除。同时aws s3 ls返回的时间是UTC标准时间,你直接用本地时间生成的$limit_date做比较,时区差会导致时间判断完全错位,极端场景下所有文件都会被判定为符合删除条件。 - 文本解析逻辑不可靠
aws s3 ls的输出字段之间可能存在多个连续空格,直接用split(' ')拆分可能生成空值;如果文件名包含空格,用split(' ')[-1]只能取到文件名的最后一段,会导致误删或者找不到文件。另外输出中的子前缀(子目录)会标注PRE标识,你没有过滤这类非文件条目,执行删除时会报错。 - 日期解析逻辑不严谨
你用ParseExact仅指定了yyyy-MM-dd格式,解析出的文件日期是当天0点的未指定时区时间,而Get-Date返回的是带时分秒的本地时间,两者比较时会出现预期外的偏差。
修复后参考脚本
# 配置桶名和前缀 $bucket = "neb-migration" $prefix = "ms-sql/" # 生成14天前的UTC日期,和S3返回的时间时区对齐 $limitUtcDate = (Get-Date).ToUniversalTime().AddDays(-14).Date # 直接调用s3api按条件筛选,避免解析文本的不确定性 $toDeleteKeys = aws s3api list-objects-v2 --bucket $bucket --prefix $prefix --query "Contents[?LastModified < '$($limitUtcDate.ToString("yyyy-MM-dd"))'].Key" --output json | ConvertFrom-Json # 批量删除符合条件的文件 foreach ($key in $toDeleteKeys) { Write-Host "正在删除:s3://$bucket/$key" aws s3 rm "s3://$bucket/$key" }
内容的提问来源于stack exchange,提问作者doctore
相关产品推荐
相关产品推荐

