如何自动删除Google Drive及服务器中7天前的备份文件?
解决自动删除7天以上备份文件的脚本问题
问题分析
原脚本存在两个核心问题:
- 服务器本地目录:
find命令未限制文件范围,导致误删目录内所有符合-mtime +7的文件(包括非备份文件),若存在子目录还会递归删除 - 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
相关产品推荐
相关产品推荐

