本文目录导读:

- 方案1:Linux/Mac 使用 rsync + crontab
- 方案2:使用 rclone(适合云存储提供商)
- 方案3:Python 脚本(跨平台)
- 方案4:Windows 批处理 + 任务计划程序
- 高级功能增强
我来帮你创建一个定时同步文件夹到云端的脚本,这里提供几种方案,你可以根据需求选择:
方案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)
-
选择合适的方案:
- Linux/Mac:推荐方案1或2
- Windows:推荐方案4
- 跨平台:方案3
-
修改配置:
- 将
LOCAL_DIR和CLOUD_DIR改为实际路径 - 根据需要调整同步频率
- 将
-
设置定时任务:
- Linux/Mac:crontab
- Windows:任务计划程序
- 跨平台:Python schedule
-
运行脚本:
# 赋予执行权限 chmod +x sync_to_cloud.sh # 手动测试 ./sync_to_cloud.sh
选择最适合你需求的方案,如果需要更多自定义功能,请告诉我具体需求!