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

为LXD批量删除快照的Bash脚本添加pv进度条的实现方法

批量删除LXD快照并展示进度及按日期筛选的实现方案

问题背景

服务器运行旧版LXD,无自动快照清理功能。原命令可批量删除名称含2022的快照,但无法通过pv展示完整删除进度;同时希望按日期筛选删除快照,但系统无法识别现有日期格式。

原命令:

lxc info wiki | awk '{print$1}' | grep wiki | grep --null '2022' | xargs -n 1 -I{} lxc delete wiki/{}

lxc info wiki输出示例:

Name: wiki
Remote: unix://
Architecture: x86_64
Created: 2018
Status: Running
Type: persistent
Profiles: macvlan-default
Pid: 3170
Ips:
  eth0: inet    X
  eth0: inet6   X
  eth0: inet6   X
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 60
  CPU usage:
    CPU usage (in seconds): 3891
  Memory usage:
    Memory (current): 231.60MB
    Memory (peak): 893.12MB
  Network usage:
    eth0:
      Bytes received: 145.47MB
      Bytes sent: 116.42MB
      Packets received: 287345
      Packets sent: 61107
    lo:
      Bytes received: 127.05kB
      Bytes sent: 127.05kB
      Packets received: 1259
      Packets sent: 1259
Snapshots:
  wiki+28092019 (taken at 2019/09/28 14:22 UTC) (stateless)
  wiki118012023 (taken at 2023/01/18 05:37 UTC) (stateless)
  wiki119082023 (taken at 2023/08/19 02:39 UTC) (stateless)
  wiki123092023 (taken at 2023/09/23 10:21 UTC) (stateless)

一、循环+pv实现删除进度可视化

先收集所有待删除快照,统计总数后通过循环逐个删除,让pv跟踪完整进度:

# 收集名称含2022的快照列表
snapshots=$(lxc info wiki | awk '/^  wiki/ {print $1}' | grep '2022')

# 统计待删除快照总数
total_snaps=$(echo "$snapshots" | wc -l)

# 若存在待删除快照,启动带进度跟踪的删除流程
if [ "$total_snaps" -gt 0 ]; then
  echo "$snapshots" | pv -l -s "$total_snaps" | while read -r snap_name; do
    lxc delete "wiki/${snap_name}"
  done
fi
  • pv -l -s "$total_snaps":-l按行数统计进度,-s传入总行数,让pv能显示已完成数/总数、百分比等完整进度信息。
  • 循环逐个执行lxc delete,确保每个快照的删除操作都被纳入进度跟踪。

二、按日期筛选删除快照

通过提取快照的创建日期并转换为可比较的格式,实现按日期范围删除:

# 设置保留的起始日期(格式:YYYYMMDD,此示例保留2023年1月1日及以后的快照)
RETENTION_DATE="20230101"

# 提取所有快照,筛选出早于保留日期的快照名称
snapshots_to_delete=$(lxc info wiki | awk '/^  wiki/ {
    snap=$1
    # 匹配并提取"taken at"后的日期字符串
    match($0, /taken at ([0-9]{4}\/[0-9]{2}\/[0-9]{2})/, date_match)
    # 将YYYY/MM/DD转换为YYYYMMDD格式,方便数字比较
    clean_date=date_match[1]
    gsub("/", "", clean_date)
    # 筛选出早于保留日期的快照
    if (clean_date < "'$RETENTION_DATE'") print snap
}')

# 统计总数并启动带进度的删除
total=$(echo "$snapshots_to_delete" | wc -l)
if [ "$total" -gt 0 ]; then
  echo "$snapshots_to_delete" | pv -l -s "$total" | while read -r snap; do
    lxc delete "wiki/${snap}"
  done
fi
  • 使用awk的match函数精准提取创建日期,通过gsub转换格式后,用数字大小比较实现日期范围筛选。
  • 修改RETENTION_DATE的值即可调整保留的日期范围,比如设置为20220101会删除2022年之前的所有快照。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:53:19