如何用实用脚本自动同步两台电脑的文件?零基础也能上手的跨设备文件同步方案
📖 目录导读
- 为什么需要脚本自动同步? – 传统方案的痛点与脚本方案的优势
- 准备工作:选对同步工具与脚本环境 – RSync、FreeFileSync、Python脚本对比
- 实战脚本一:基于RSync的Linux/Mac双向同步脚本
- 实战脚本二:用Python+Watchdog实现Windows实时同步
- 自动化部署:定时任务与触发器设置 – Cron、Task Scheduler、NAS联动
- 常见问题与安全实践 – 冲突处理、加密传输、日志监控
- 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加密通道
部署方法:
- 在两台电脑上配置SSH密钥登录(
ssh-copy-id userB@192.168.1.101) - 将脚本加入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运行批处理脚本
- 将上述脚本保存为
sync.bat如:@echo off python C:\scripts\realtime_sync.py
- 打开“任务计划程序” → 创建任务 → 触发器设为“登录时” +“每隔1小时”
- 条件中取消“只有在计算机使用交流电时才启动任务”
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)。
通过以上脚本方案,你可以轻松实现两台电脑之间文件的自动、增量、加密同步,无论是办公文档同步、代码版本备份,还是家庭媒体库共享,都能找到适合你的实现路径,动手尝试时,建议先从单次手动执行脚本开始,确认无误后再部署为定时任务——自动化不是一蹴而就,而是从可重复的手动步骤开始优化。