随机
Enter 搜索 ↑↓ 切换 Esc 清空

pve_dump_clean

脚本

清理 PVE 备份文件的日志和备注工具

pve_dump_clean

清理 PVE 备份文件的日志和备注工具

一键脚本

bash <(curl -sL gitee.com/meimolihan/linux-command_sh/raw/master/pve_dump_clean.sh)

效果预览

执行脚本效果预览

补充说明

该脚本用于清理 Proxmox VE(PVE)虚拟化平台的备份目录中的冗余日志和备注文件,基于 rmfindstatdu 命令实现,适合需要释放 PVE 存储空间、定期维护备份目录的场景。

功能特点

输出说明

脚本输出包含以下字段:

字段 说明
路径 显示 PVE 备份目录 /var/lib/vz/dump
总计 目录占用的总磁盘空间
文件列表 按时间排序显示所有文件(权限、链接、所有者、组、大小、修改时间、文件名)
即将删除 提示将要删除的文件类型模式
确认提示 用户确认是否执行删除操作
状态提示 [删除前]、[删除后] 等标记区分前后状态

注意事项

脚本源码

#!/bin/bash
set -uo pipefail

gl_hui=$'\033[38;5;59m'
gl_huang=$'\033[38;5;11m'
gl_lan=$'\033[38;5;32m'
gl_lv=$'\033[38;5;10m'
gl_qing=$'\033[38;5;14m'
gl_zi=$'\033[38;5;13m'
gl_bai=$'\033[38;5;15m'
gl_bufan=$'\033[38;5;14m'
gl_hong=$'\033[38;5;9m'
reset=$'\033[0m'

CLEAN_DIR="/var/lib/vz/dump"
CLEAN_FILES=("*.log" "*.notes")

break_end() {
    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
    echo -e "${gl_lv}操作完成${reset}"
    echo -e "${gl_bai}按任意键继续 ${gl_hong}.${gl_huang}.${gl_lv}.${reset}\c"
    read -r -n 1 -s
    echo ""
    clear
}

list_beautify_directory() {
    local target_dir="${1:-.}"
    [[ -d "$target_dir" ]] || {
        echo -e "${gl_hong}错误:目录不存在 → $target_dir${reset}"
        return 1
    }

    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
    echo -e "${gl_lan}路径:${gl_huang}${target_dir}${reset}"
    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"

    du -sh "$target_dir" 2>/dev/null | awk -v qing="$gl_qing" -v rst="$reset" \
        '{print qing "总计 " $1 rst}'

    find "$target_dir" -maxdepth 1 -type f -printf '%T@ %p\0' |
    sort -zn |
    while IFS= read -r -d '' line; do
        mtime="${line%% *}"
        file="${line#* }"

        stat --format="%A %h %U %G %s" "$file" | awk \
            -v hui="$gl_hui" \
            -v huang="$gl_huang" \
            -v lan="$gl_lan" \
            -v lv="$gl_lv" \
            -v qing="$gl_qing" \
            -v zi="$gl_zi" \
            -v rst="$reset" \
            -v mtime="$mtime" \
            -v fname="$(basename "$file")" '
        {
            size=$5
            if (size >= 1073741824)
                size=sprintf("%.1fG", size/1073741824)
            else if (size >= 1048576)
                size=sprintf("%.1fM", size/1048576)
            else if (size >= 1024)
                size=sprintf("%.1fK", size/1024)
            else
                size=size "B"

            cmd="date -d @" mtime " \"+%F %T\""
            cmd | getline ctime
            close(cmd)

            printf "%-12s %4s %-8s %-8s %6s %-19s %s\n",
                hui $1 rst,
                huang $2 rst,
                lan $3 rst,
                lv $4 rst,
                huang size rst,
                qing ctime rst,
                zi fname rst
        }'
    done
}

main() {
    clear
    
    if ! command -v qm &> /dev/null; then
        echo -e ""
        echo -e "${gl_zi}>>> 一键清理 PVE 备份文件的所有日志和备注文件${gl_bai}"
        echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
        log_error "未检测到Proxmox VE环境,请确保脚本在PVE节点上运行"
        echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
        break_end
        return 1
    fi
        
    echo -e "${gl_zi}>>> ${gl_huang}【删除前】${gl_zi}目录文件列表(按时间排序)${reset}"
    list_beautify_directory "$CLEAN_DIR"
    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
    echo -e "\n"

    echo -e "${gl_zi}>>> 一键清理 PVE 备份文件的所有日志和备注文件${reset}"
    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
    echo -e "${gl_hong}即将删除以下文件:${reset}"
    for pattern in "${CLEAN_FILES[@]}"; do
        echo -e "  ${gl_huang}$CLEAN_DIR/$pattern${reset}"
    done

    echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
    echo -e "${gl_bai}确认执行删除?(${gl_lv}y${gl_bai}/${gl_hong}N${gl_bai}):\c"
    read -r confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        echo -e "${gl_lv}已取消删除操作${reset}"
        break_end
        exit 0
    fi

    echo -e "\n${gl_qing}正在执行删除 ${gl_hong}.${gl_huang}.${gl_lv}.${reset}"
    for pattern in "${CLEAN_FILES[@]}"; do
        rm -f "$CLEAN_DIR"/$pattern
    done
    echo -e "${gl_lv}删除完成!${reset}\n"

    echo -e ""

    echo -e "${gl_zi}>>> ${gl_huang}【删除后】${gl_zi}目录文件列表(按时间排序)${reset}"
    list_beautify_directory "$CLEAN_DIR"

    break_end
}

main "$@"

创建本地脚本

new_script="new_test.sh"

cat > "$new_script" << 'EOF'
#!/bin/bash

# 粘贴脚本源码

EOF

chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"