用脚本定时同步文件夹到云端

wen 实用脚本 1

本文目录导读:

用脚本定时同步文件夹到云端

  1. 方案1:Linux/Mac 使用 rsync + crontab
  2. 方案2:使用 rclone(适合云存储提供商)
  3. 方案3:Python 脚本(跨平台)
  4. 方案4:Windows 批处理 + 任务计划程序
  5. 高级功能增强

我来帮你创建一个定时同步文件夹到云端的脚本,这里提供几种方案,你可以根据需求选择:

方案1:Linux/Mac 使用 rsync + crontab

安装 rsync(如果未安装)

# Ubuntu/Debian
sudo apt-get install rsync
# Mac
brew install rsync
# CentOS/RHEL
sudo yum install rsync

创建同步脚本 sync_to_cloud.sh

#!/bin/bash
# ==================== 配置区 ====================
# 本地文件夹路径
LOCAL_DIR="/path/to/your/local/folder"
# 云端挂载点(如 rclone 挂载的云盘)
CLOUD_DIR="/path/to/cloud/mount"
# 日志文件路径
LOG_FILE="/var/log/sync_log.log"
# 排除的文件或目录(可选)
EXCLUDE_FILES="--exclude='*.tmp' --exclude='cache/'"
# ==================== 同步逻辑 ====================
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始同步" >> $LOG_FILE
# 使用 rsync 进行增量同步
rsync -avz --delete $EXCLUDE_FILES \
    $LOCAL_DIR/ \
    $CLOUD_DIR/ \
    2>> $LOG_FILE
# 检查同步是否成功
if [ $? -eq 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 同步成功" >> $LOG_FILE
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 同步失败" >> $LOG_FILE
fi

设置定时任务(crontab)

# 编辑 crontab
crontab -e
# 示例:每天凌晨2点同步
0 2 * * * /path/to/sync_to_cloud.sh
# 示例:每6小时同步一次
0 */6 * * * /path/to/sync_to_cloud.sh
# 示例:每30分钟同步
*/30 * * * * /path/to/sync_to_cloud.sh

方案2:使用 rclone(适合云存储提供商)

安装 rclone

# Linux
curl https://rclone.org/install.sh | sudo bash
# Mac
brew install rclone

配置 rclone

# 初始化配置
rclone config
# 配置完成后测试连接
rclone ls remote:/

同步脚本 rclone_sync.sh

#!/bin/bash
# ==================== 配置区 ====================
LOCAL_DIR="/path/to/local/folder"
REMOTE_DIR="remote:cloud-backup/folder"
# ==================== 同步逻辑 ====================
# 同步到云端
rclone sync $LOCAL_DIR $REMOTE_DIR \
    --progress \
    --ignore-existing \
    --log-file=/var/log/rclone_sync.log
# 或者使用 copy(不会删除云端多余文件)
# rclone copy $LOCAL_DIR $REMOTE_DIR --progress

方案3:Python 脚本(跨平台)

创建 auto_sync.py

#!/usr/bin/env python3
import os
import shutil
import sys
import logging
from datetime import datetime
import schedule
import time
# ==================== 配置区 ====================
LOCAL_DIR = "/path/to/local/folder"
CLOUD_DIR = "/path/to/cloud/folder"
logging.basicConfig(
    filename='sync.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
def sync_folders():
    """同步文件夹到云端"""
    try:
        logging.info(f"开始同步: {LOCAL_DIR} -> {CLOUD_DIR}")
        # 确保目标目录存在
        os.makedirs(CLOUD_DIR, exist_ok=True)
        # 遍历本地文件
        for root, dirs, files in os.walk(LOCAL_DIR):
            relative_path = os.path.relpath(root, LOCAL_DIR)
            target_dir = os.path.join(CLOUD_DIR, relative_path)
            # 创建对应目录
            os.makedirs(target_dir, exist_ok=True)
            # 复制文件
            for file in files:
                source_file = os.path.join(root, file)
                target_file = os.path.join(target_dir, file)
                # 只在文件不存在或大小不同时复制
                if os.path.exists(target_file):
                    if os.path.getsize(source_file) != os.path.getsize(target_file):
                        shutil.copy2(source_file, target_file)
                        logging.info(f"更新文件: {source_file}")
                else:
                    shutil.copy2(source_file, target_file)
                    logging.info(f"新文件: {source_file}")
        logging.info("同步完成")
    except Exception as e:
        logging.error(f"同步失败: {str(e)}")
# ==================== 定时任务设置 ====================
def main():
    # 立即执行一次
    sync_folders()
    # 每天执行(可选多种时间方案)
    schedule.every().day.at("02:00").do(sync_folders)      # 每天凌晨2点
    schedule.every().hour.do(sync_folders)                  # 每小时
    schedule.every(30).minutes.do(sync_folders)             # 每30分钟
    logging.info("定时同步脚本已启动")
    # 持续运行
    while True:
        schedule.run_pending()
        time.sleep(1)
if __name__ == "__main__":
    main()

方案4:Windows 批处理 + 任务计划程序

创建 sync_windows.bat

@echo off
echo ==============================
echo 文件夹同步脚本
echo ==============================
set LOCAL_DIR=C:\path\to\local\folder
set CLOUD_DIR=D:\cloud\folder
set LOG_FILE=C:\sync_log.txt
echo %date% %time% - 开始同步 >> %LOG_FILE%
:: 使用 robocopy 进行同步
robocopy "%LOCAL_DIR%" "%CLOUD_DIR%" /MIR /R:2 /W:2 /LOG:%LOG_FILE%
if %ERRORLEVEL% LEQ 7 (
    echo %date% %time% - 同步成功 >> %LOG_FILE%
) else (
    echo %date% %time% - 同步失败 >> %LOG_FILE%
)

设置 Windows 任务计划程序

# 创建计划任务(管理员权限)
schtasks /create /tn "云盘同步" /tr "C:\path\to\sync_windows.bat" /sc daily /st 02:00

高级功能增强

带备份的同步

#!/bin/bash
# 在同步前先备份旧版本
BACKUP_DIR="/path/to/backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
rsync -avb --delete --backup-dir=$BACKUP_DIR \
    $LOCAL_DIR/ $CLOUD_DIR/

条件同步(文件变更才会触发)

import hashlib
def file_changed(source, target):
    if not os.path.exists(target):
        return True
    # 比较文件大小
    if os.path.getsize(source) != os.path.getsize(target):
        return True
    # 比较 MD5 哈希
    hash1 = hashlib.md5(open(source, 'rb').read()).hexdigest()
    hash2 = hashlib.md5(open(target, 'rb').read()).hexdigest()
    return hash1 != hash2

邮件通知同步结果

import smtplib
from email.mime.text import MIMEText
def send_notification(subject, body):
    # 邮件配置
    sender = 'your_email@example.com'
    recipient = 'admin@example.com'
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = recipient
    # 发送邮件
    with smtplib.SMTP('smtp.example.com', 587) as server:
        server.starttls()
        server.login(sender, 'password')
        server.send_message(msg)
  1. 选择合适的方案

    • Linux/Mac:推荐方案1或2
    • Windows:推荐方案4
    • 跨平台:方案3
  2. 修改配置

    • LOCAL_DIRCLOUD_DIR 改为实际路径
    • 根据需要调整同步频率
  3. 设置定时任务

    • Linux/Mac:crontab
    • Windows:任务计划程序
    • 跨平台:Python schedule
  4. 运行脚本

    # 赋予执行权限
    chmod +x sync_to_cloud.sh
    # 手动测试
    ./sync_to_cloud.sh

选择最适合你需求的方案,如果需要更多自定义功能,请告诉我具体需求!

抱歉,评论功能暂时关闭!