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

如何自动删除Google Drive及服务器中7天前的备份文件?

解决自动删除7天以上备份文件的脚本问题

问题分析

原脚本存在两个核心问题:

  1. 服务器本地目录:find命令未限制文件范围,导致误删目录内所有符合-mtime +7的文件(包括非备份文件),若存在子目录还会递归删除
  2. Google Drive处理:gdrive files list默认输出的时间格式无法被date -d正确解析,且未处理UTC时区差异

解决方案

1. 服务器本地备份文件清理优化

修改find命令,添加精准限制避免误删:

  • 按备份文件的命名规则匹配(例如后缀为.sql.gz或包含backup关键字)
  • 用-maxdepth 1限制仅搜索当前目录(避免递归删除子目录文件)
  • 测试阶段先执行带-print的命令,确认待删文件无误后再替换为删除命令

示例修改:

# 仅匹配当前目录下后缀为.sql.gz的备份文件,先打印测试
find "$SERVER_BACKUP_DIR" -maxdepth 1 -type f -name "*.sql.gz" -mtime +7 -print
# 确认无误后替换为删除命令
# find "$SERVER_BACKUP_DIR" -maxdepth 1 -type f -name "*.sql.gz" -mtime +7 -exec rm {} \;

2. Google Drive备份文件清理修复

核心修改点:

  • 使用gdrive files list的--fields参数指定仅输出需要的字段(文件ID、修改时间),避免解析默认输出时的格式混乱
  • 处理Google Drive返回的UTC标准时间格式,用date -u转换为Unix时间戳解决时区差异问题
  • 用--no-header参数直接去掉表头,替代tail -n +2的不稳定写法
  • 添加错误处理,避免因单行解析失败导致脚本中断

完整修改后的脚本

#!/bin/bash

# 配置参数:替换为实际路径和Google Drive文件夹ID
SERVER_BACKUP_DIR="/path/to/backups"
GOOGLE_DRIVE_FOLDER_ID="your-google-drive-folder-id"

# 计算7天前的Unix时间戳(UTC时区)
ONE_WEEK_THRESHOLD=$(( $(date -u +%s) - 604800 ))

# 清理服务器本地7天以上的备份文件
# 先执行带-print的测试命令,确认无误后再启用rm命令
find "$SERVER_BACKUP_DIR" -maxdepth 1 -type f -name "*.sql.gz" -mtime +7 -print
# find "$SERVER_BACKUP_DIR" -maxdepth 1 -type f -name "*.sql.gz" -mtime +7 -exec rm {} \;

# 清理Google Drive中7天以上的备份文件
# 使用--fields指定输出字段,--no-header去掉表头,--sort modifiedTime按时间排序
gdrive files list \
  --query "'$GOOGLE_DRIVE_FOLDER_ID' in parents" \
  --fields id,modifiedTime \
  --no-header \
  --sort modifiedTime | while IFS=$'\t' read -r file_id modified_time; do
    # 将Google Drive的UTC时间转换为Unix时间戳
    modified_time_seconds=$(date -u -d "${modified_time%Z}" +%s 2>/dev/null)
    # 跳过时间解析失败的行
    if [ -z "$modified_time_seconds" ]; then
        echo "跳过无法解析时间的文件:$file_id"
        continue
    fi
    # 判断是否超过7天,是则删除
    if [ "$modified_time_seconds" -lt "$ONE_WEEK_THRESHOLD" ]; then
        echo "删除Google Drive文件:$file_id"
        # 先执行echo测试,确认无误后启用删除命令
        # gdrive files delete "$file_id"
    fi
done

关键修改说明

  • 本地清理:通过-name精准匹配备份文件,-maxdepth 1防止误删子目录内容,测试阶段用-print替代rm确保安全
  • Google Drive处理:
    • --fields id,modifiedTime让输出仅包含文件ID和ISO格式的修改时间,避免解析默认表格输出时的列错位
    • date -u -d "${modified_time%Z}" +%s移除时间字符串末尾的Z,并以UTC时区解析,避免本地时区差异导致的时间判断错误
    • 添加错误处理,跳过时间解析失败的文件,确保脚本稳定执行
    • 测试阶段用echo输出待删文件ID,确认无误后再启用gdrive files delete

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:43:27