pve_dump_clean
清理 PVE 备份文件的日志和备注工具
一键脚本
bash <(curl -sL gitee.com/meimolihan/linux-command_sh/raw/master/pve_dump_clean.sh)
效果预览
补充说明
该脚本用于清理 Proxmox VE(PVE)虚拟化平台的备份目录中的冗余日志和备注文件,基于 rm、find、stat、du 命令实现,适合需要释放 PVE 存储空间、定期维护备份目录的场景。
功能特点
- 定向清理:仅删除
*.log和*.notes文件,保留*.vma、*.vma.zst、*.img等备份镜像文件 - 删除前预览:执行前以格式化列表展示当前目录所有文件,确认后再操作
- 删除后对比:清理后再次列出目录文件,直观对比清理效果
- 交互确认:删除前要求用户确认,防止误操作
- 彩色输出:使用 ANSI 颜色码区分不同状态和提示信息
输出说明
脚本输出包含以下字段:
| 字段 | 说明 |
|---|---|
| 路径 | 显示 PVE 备份目录 /var/lib/vz/dump |
| 总计 | 目录占用的总磁盘空间 |
| 文件列表 | 按时间排序显示所有文件(权限、链接、所有者、组、大小、修改时间、文件名) |
| 即将删除 | 提示将要删除的文件类型模式 |
| 确认提示 | 用户确认是否执行删除操作 |
| 状态提示 | [删除前]、[删除后] 等标记区分前后状态 |
注意事项
- 仅清理
/var/lib/vz/dump目录下的*.log和*.notes文件 - 操作前会要求用户输入
y确认,不确认则安全退出 - 清理后无法恢复,建议操作前确认日志文件已不再需要
- 备份镜像文件(
vma、zst、img等)不受影响 - 脚本需以 root 或具有
sudo权限的用户执行
脚本源码
#!/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"