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

DigitalOcean DOCTL与Bash循环问题:需控制快照保留数量为12个

完善后的Droplet快照脚本(自动保留最新12个)

我帮你把脚本升级了,不仅能创建带时间戳的快照,还会自动清理旧快照,只保留最新的12个。下面是完整可运行的脚本,我会拆解关键功能:

#!/bin/bash
# 脚本使用DigitalOcean的CLI工具doctl创建Droplet快照,并自动保留最新12个

# 配置参数:替换成你的Droplet ID
DROPLET_ID="80750079"
# 要保留的最新快照数量
RETENTION_COUNT=12

# 生成规范的时间戳作为快照名称(格式:年-月-日_时-分-秒)
timestamp() {
  NAME=$(date +"%Y-%m-%d_%H-%M-%S")
}

# 1. 创建新快照
timestamp
echo "Creating snapshot with name: $NAME"
doctl compute droplet-action snapshot --snapshot-name "$NAME" "$DROPLET_ID"

# 2. 获取需要删除的旧快照ID(跳过最新的RETENTION_COUNT个)
# 说明:先按创建时间降序排列,跳过表头和前RETENTION_COUNT个快照,剩下的就是要删除的
OLD_SNAPSHOTS=$(doctl compute droplet snapshots "$DROPLET_ID" --format ID,CreatedAt --sort CreatedAt:desc | awk -v count="$RETENTION_COUNT" 'NR>count+1 {print $1}')

# 3. 批量删除旧快照
if [ -n "$OLD_SNAPSHOTS" ]; then
  echo "Found $(echo "$OLD_SNAPSHOTS" | wc -w) old snapshots to delete..."
  for SNAPSHOT_ID in $OLD_SNAPSHOTS; do
    echo "Deleting snapshot ID: $SNAPSHOT_ID"
    doctl compute snapshot delete "$SNAPSHOT_ID" --force
  done
  echo "Old snapshots cleanup completed."
else
  echo "No old snapshots need to be deleted (current count ≤ $RETENTION_COUNT)."
fi

关键功能解释:

  • 可配置参数:把Droplet ID和保留数量做成变量,后续修改不用翻找脚本内容,更灵活
  • 规范时间戳:用%Y-%m-%d_%H-%M-%S格式生成快照名称,不仅可读性强,排序也更准确(避免原date命令输出的空格问题)
  • 精准获取快照:用doctl compute droplet snapshots $DROPLET_ID直接获取指定Droplet的所有快照,比全局过滤更可靠
  • 智能清理逻辑:
    • 按创建时间降序排列快照,确保最新的排在最前面
    • 用awk跳过表头和前12个最新快照,剩下的就是需要删除的旧快照
    • 批量删除前先检查是否有旧快照,避免空操作报错

使用注意:

  1. 确保你的doctl已经完成认证(执行过doctl auth init)
  2. 测试时可以先把doctl compute snapshot delete改成echo "Would delete snapshot ID: $SNAPSHOT_ID",确认要删除的快照是正确的再执行真实删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:00