如何用实用脚本自动同步两台电脑的文件?

wen 实用脚本 3

如何用实用脚本自动同步两台电脑的文件?零基础也能上手的跨设备文件同步方案

📖 目录导读

  1. 为什么需要脚本自动同步? – 传统方案的痛点与脚本方案的优势
  2. 准备工作:选对同步工具与脚本环境 – RSync、FreeFileSync、Python脚本对比
  3. 实战脚本一:基于RSync的Linux/Mac双向同步脚本
  4. 实战脚本二:用Python+Watchdog实现Windows实时同步
  5. 自动化部署:定时任务与触发器设置 – Cron、Task Scheduler、NAS联动
  6. 常见问题与安全实践 – 冲突处理、加密传输、日志监控
  7. Q&A问答专区 – 解决同步重复、断点续传、跨平台兼容等高频问题

为什么需要脚本自动同步?

许多用户习惯用U盘拷贝或网盘中转文件,但这类方案存在明显缺陷:

如何用实用脚本自动同步两台电脑的文件?

  • 手动操作繁琐:忘记同步导致版本混乱
  • 网盘速度受限:大文件上传下载耗时,且隐私风险高
  • 跨平台困难:Windows与macOS/Linux间文件格式兼容性问题

脚本自动同步的核心价值

  • 无需第三方服务器,直接通过局域网或VPN直连
  • 可自定义同步规则(仅同步特定扩展名、排除临时文件)
  • 支持增量同步与版本回溯(类似Git的简易替代方案)

准备工作:选对同步工具与脚本环境

方案对比表

工具/语言 适用场景 学习成本 实时监控能力
RSync Linux/macOS双向同步 需配合inotify或crontab
FreeFileSync 跨平台(Windows/Mac)图形化脚本 内置实时同步(需付费版)
Python + Watchdog 全平台定制化实时同步 原生文件事件监听

推荐组合

  • 局域网内高频率同步 → RSync + Cron(性能最优)
  • 跨公网、需加密 → Python + Rsync封装(支持SSH隧道)
  • 纯粹Windows用户 → FreeFileSync批处理脚本(GUI友好)

实战脚本一:基于RSync的Linux/Mac双向同步脚本

假设你有一台主机(A)和一台笔记本(B),两者通过局域网192.168.1.x互访。

(双向同步.sh)

#!/bin/bash
# 双向同步:保证A和B的/Data文件夹内容一致
# 定义路径
LOCAL_DIR="/Data"
REMOTE_USER="userB"
REMOTE_IP="192.168.1.101"
REMOTE_DIR="/Data"
EXCLUDE_FILE="/path/to/exclude.txt"  # 排除临时文件或系统文件
# 从B拉取到A
rsync -avz --delete --exclude-from="$EXCLUDE_FILE" -e "ssh -p 22" \
  "$REMOTE_USER@$REMOTE_IP:$REMOTE_DIR/" "$LOCAL_DIR/"
# 从A推送到B(注意顺序避免冲突)
rsync -avz --delete --exclude-from="$EXCLUDE_FILE" -e "ssh -p 22" \
  "$LOCAL_DIR/" "$REMOTE_USER@$REMOTE_IP:$REMOTE_DIR/"

关键参数说明

  • -a 归档模式(保留权限、时间戳)
  • -vz 显示详情并压缩传输
  • --delete 删除目标端多余文件(确保完全一致)
  • -e “ssh -p 22” 指定SSH加密通道

部署方法

  1. 在两台电脑上配置SSH密钥登录(ssh-copy-id userB@192.168.1.101
  2. 将脚本加入Crontab:*/5 * * * * /path/to/sync.sh(每5分钟同步一次)

实战脚本二:用Python+Watchdog实现Windows实时同步

当文件发生变化时立刻触发同步,比定时任务更高效。

Step 1: 安装依赖

pip install watchdog paramiko  # Watchdog监听文件变化,Paramiko实现SSH传输

Step 2: 核心脚本(realtime_sync.py)

import time
import paramiko
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class SyncHandler(FileSystemEventHandler):
    def __init__(self, local_path, remote_config):
        self.local_path = local_path
        self.remote_config = remote_config  # 包含IP、端口、用户名、密码/密钥
        self.transport = None
        self.connect_ssh()
    def connect_ssh(self):  # 建立SSH连接复用
        self.transport = paramiko.Transport((self.remote_config['ip'], 22))
        self.transport.connect(username=self.remote_config['user'], 
                               password=self.remote_config['password'])
    def rsync_file(self, file_path):  # 使用rsync命令触发上传
        relative_path = os.path.relpath(file_path, self.local_path)
        remote_full_path = f"{self.remote_config['remote_dir']}/{relative_path}"
        # 通过SSH执行rsync命令(简化示例,实际建议直接用scp)
        cmd = f"rsync -avz {file_path} user@{ip}:{remote_full_path}"
        os.system(cmd)
    def on_modified(self, event):
        if not event.is_directory:
            self.rsync_file(event.src_path)
if __name__ == "__main__":
    local_watch = r"C:\SyncFolder"
    remote_setting = {
        'ip': '192.168.1.101',
        'user': 'userB',
        'password': 'your_password',  # 建议改用密钥认证
        'remote_dir': '/home/userB/SyncFolder'
    }
    handler = SyncHandler(local_watch, remote_setting)
    observer = Observer()
    observer.schedule(handler, path=local_watch, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

注意

  • 为避免循环触发(比如接收端写入后又被本地监听),建议同步时忽略另一端的写入事件(可在脚本中加入IP白名单过滤)
  • 生产环境建议用watchdog官方示例中的队列机制处理批量事件

自动化部署:定时任务与触发器

Windows:使用Task Scheduler运行批处理脚本

  1. 将上述脚本保存为sync.bat如:
    @echo off
    python C:\scripts\realtime_sync.py
  2. 打开“任务计划程序” → 创建任务 → 触发器设为“登录时” +“每隔1小时”
  3. 条件中取消“只有在计算机使用交流电时才启动任务”

Linux/macOS:Cron + Systemd

Crontab示例(每10分钟同步一次):

*/10 * * * * /home/user/sync_data.sh >> /var/log/sync.log 2>&1

Systemd服务(开机自启动实时监听):

[Unit]
Description=File Sync Watcher
[Service]
ExecStart=/usr/bin/python3 /home/user/realtime_sync.py
Restart=always
User=user
[Install]
WantedBy=multi-user.target

常见问题与安全实践

冲突处理:当同一文件在两台电脑同时被修改

方案

  • 使用rsync --backup保留冲突版本(备份文件带上时间戳)
  • 或采用“最后一次写入为准”的策略,结合文件修改时间戳判断

断点续传:传输中断后自动恢复

rsync自带断点续传能力(参考--partial参数),无需额外处理

网络安全:避免明文密码泄露

  • 优先使用SSH密钥认证ssh-keygen -t rsa生成)
  • 公网传输时启用VPN(如WireGuard)+ rsync隧道

Q&A问答专区

Q1:脚本同步与云盘同步的核心区别是什么?
A:云盘依赖第三方,速度受限于运营商;脚本同步基于本地网络或直连,速度可达千兆,且数据完全自控。

Q2:同步时总出现重复文件(如“文件夹(1)”),如何避免?
A:检查是否同时运行了多个同步任务;在脚本中加入--delete参数,并确保只在一端设置实时监控。

Q3:电脑A是Windows,电脑B是Linux,能否实现双向同步?
A:可以,在Windows上用Python脚本调用rsync(通过Git Bash或Cygwin环境),或用FreeFileSync生成跨平台批处理脚本。

Q4:同步大文件(>10GB)时脚本死机怎么办?
A:增加--progress参数监控进度,并设置内存限制,若系统资源不足,可在rsync命令后加上--bwlimit=10000限制带宽(单位KB/s)。

Q5:如何确保同步后文件权限不变?
A:Windows下需运行脚本时以管理员身份,Linux下确保rsync-a参数包含权限保留标志,跨系统同步时,建议忽略权限位(添加--no-perms)。


通过以上脚本方案,你可以轻松实现两台电脑之间文件的自动、增量、加密同步,无论是办公文档同步、代码版本备份,还是家庭媒体库共享,都能找到适合你的实现路径,动手尝试时,建议先从单次手动执行脚本开始,确认无误后再部署为定时任务——自动化不是一蹴而就,而是从可重复的手动步骤开始优化

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