You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3桶assets目录保留最新部署文件夹,aws s3 rm排除失效问题

问题分析与解决

你的排除规则失效的核心原因是匹配路径不对应,AWS S3 CLI的--exclude/--include是基于「相对于你指定操作路径的相对路径」来匹配的,而且必须覆盖完整的目标对象路径:

  1. 你指定的操作路径是s3://$AWS_CDN_BUCKET/assets/,所以CLI会把assets/下的内容按相对路径处理:
    • 目录对象的相对路径是2023.03.30-a861c982/
    • 目录下文件的相对路径是2023.03.30-a861c982/my-file.txt
  2. 你用--exclude $MOST_RECENT_DEPLOY(也就是--exclude 2023.03.30-a861c982),只会匹配相对路径完全等于这个字符串的对象,但S3里不存在这样的对象——目录的相对路径带末尾斜杠,文件的相对路径带子路径,所以这个排除规则完全没匹配到任何内容,导致所有对象都被标记为待删除。

修正后的命令

要正确排除最新目录及其下的所有内容,需要匹配目录本身和目录下的所有文件:

export MOST_RECENT_DEPLOY=$(aws s3api list-objects-v2 --bucket $AWS_CDN_BUCKET --prefix assets --query 'reverse(sort_by(Contents,&LastModified))[0]' | jq -r '.Key | split("/") | .[1]')
echo "Pruning all asset folder except .../assets/$MOST_RECENT_DEPLOY"
aws s3 rm "s3://$AWS_CDN_BUCKET/assets/" --exclude "$MOST_RECENT_DEPLOY/" --exclude "$MOST_RECENT_DEPLOY/**" --recursive --dryrun

补充说明

  • $MOST_RECENT_DEPLOY/ 匹配目录对象本身(S3的目录是特殊的空对象,Key带末尾斜杠)
  • $MOST_RECENT_DEPLOY/** 匹配该目录下的所有子文件和子目录(**是递归通配符,匹配任意层级的路径)
  • 如果你的部署目录命名不会和其他目录前缀冲突,也可以简化为--exclude "$MOST_RECENT_DEPLOY*",但用/**的方式更严谨,避免误排除类似前缀的目录。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:37:10