rclone定时备份文件到网盘

定时备份文件到网盘

前言

建站都遇到过vps宕机,没有备份网站,导致网站数据丢失。可以利用这个脚本,定时备份文件到网盘。

安装rclone

curl https://rclone.org/install.sh | sudo bash
rclone config

以mega网盘为例

脚本

    #!/bin/bash
    
    # ==============================
    #        可配置项
    # ==============================
    
    # 要备份的目录(不要加 /)
    source_dir="/备份目录"
    
    # 本地备份目录
    backup_dir="/本地备份目录"
    mkdir -p "$backup_dir"
    
    # rclone 远程路径(例如 gdrive:/backup)
    remote="路径:/文件路径"
    
    # 允许通过环境变量设置自定义前缀,默认值为 "backup"
    filename_prefix="${FILENAME_PREFIX:-backup}"
    
    # ==============================
    #        自动变量
    # ==============================
    
    now=$(date +"%Y-%m-%d_%H-%M-%S")
    backup_file="$backup_dir/${filename_prefix}_${now}.zip"
    
    parent_dir=$(dirname "$source_dir")
    target_dir=$(basename "$source_dir")
    
    echo "======================================"
    echo "📦 开始备份任务"
    echo "源目录: $source_dir"
    echo "备份文件: $backup_file"
    echo "======================================"
    
    # ==============================
    #         开始压缩(静默)
    # ==============================
    
    cd "$parent_dir" || { echo "❌ 无法进入目录 $parent_dir"; exit 1; }
    
    echo "📦 正在压缩..."
    zip -r "$backup_file" "$target_dir" > /dev/null
    
    if [ $? -ne 0 ]; then
        echo "❌ 压缩失败"
        exit 1
    fi
    
    echo "✅ 压缩完成"
    du -h "$backup_file"
    
    # ==============================
    #         上传到远程(显示进度)
    # ==============================
    
    echo "======================================"
    echo "📤 开始上传到远程:$remote"
    echo "======================================"
    
    rclone copy "$backup_file" "$remote" \
        --progress \
        --stats 5s \
        --stats-one-line \
        --transfers=1 \
        --checkers=1
    
    if [ $? -ne 0 ]; then
        echo "❌ 上传失败"
        exit 1
    fi
    
    echo "✅ 上传完成"
    
    # ==============================
    #      清理本地旧备份
    # ==============================
    
    echo "🗑️ 清理本地旧备份(保留最近 3 个)..."
    
    ls -1t "$backup_dir"/${filename_prefix}_*.zip 2>/dev/null | sed -e '1,3d' | while read old_file; do
        echo "删除本地:$old_file"
        rm -f "$old_file"
    done
    
    # ==============================
    #      清理远程旧备份
    # ==============================
    
    echo "🗑️ 清理远程旧备份(保留最近 3 个)..."
    
    rclone lsf "$remote" --files-only | \
    grep "^${filename_prefix}_" | \
    sort -r | \
    awk 'NR>3' | \
    while read file; do
        echo "删除远程:$file"
        rclone deletefile "$remote/$file"
    done
    
    echo "======================================"
    echo "🎉 所有操作完成"
    echo "======================================"

设置定时任务

crontab -e

每天0点和早上6点执行

0 0,6 * * * /脚本路径
免责声明
⏱ 已运行: 加载中...