如果你有一份经常变动的文件夹(例如:项目源码、写作资料、设计工程、照片整理目录),想要定期同步到另一台 Mac / Linux 主机或 NAS,并且希望:
1)只传输增量变更;2)可验证传输结果;3)必要时能找回上一版文件。
那么 https://www.rsync.samba.org/ + SSH 是一套足够稳的组合。本文以 macOS 为例给出可直接改路径复用的命令模板。
macOS 一般自带 rsync/ssh。先在本机终端确认版本:
rsync --version
ssh -V
如果目标是一台远程机器(如 NAS 或另一台电脑),确保你能用 SSH 登录(推荐使用密钥)。生成密钥并复制到目标主机(示例用户名与主机请替换):
ssh-keygen -t ed25519 -C "backup"
ssh-copy-id user@your-host
参考说明:https://ss64.com/osx/ssh-copy-id.html
假设你要把本机的 ~/Work/ProjectA/ 同步到目标机的 /data/backups/ProjectA/current/。
建议先用 --dry-run 预演(不真正写入),确认会发生什么:
rsync -avh --delete --dry-run -e "ssh" ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/current/
确认无误后去掉 --dry-run 执行正式同步:
rsync -avh --delete -e "ssh" ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/current/
说明:
- -a:尽量保留权限/时间戳等;-v:输出过程;-h:友好显示。
- --delete:让目标端镜像一致(源端删了什么,目标端也删)。如果你不确定,先不要加。
很多目录没必要备份(例如 node_modules、构建产物、缓存)。你可以用 --exclude 或者写一个排除文件:
rsync -avh --delete --exclude ".DS_Store" --exclude "node_modules/" --exclude "dist/" -e "ssh" ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/current/
如果排除项很多,推荐用文件(例如 ~/.config/rsync-exclude.txt),内容一行一个模式,然后:
rsync -avh --delete --exclude-from="$HOME/.config/rsync-exclude.txt" -e "ssh" ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/current/
如果你希望保留每天(或每次)同步时的快照,但又不想每次都完整复制一份,可以使用硬链接快照(同一文件未变化时不重复占用空间)。常见做法是:
1)当前目录写到按日期命名的目录;2)用 -- -dest 指向上一份快照。
示例(在本机执行,同步到目标机;日期目录按需要调整):
DATE=$(date +%Y-%m-%d)
rsync -avh --delete -e "ssh" -- -dest=/data/backups/ProjectA/latest/ ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/$DATE/
同步完成后,把 latest 软链接(或目录)更新到最新快照(在目标机执行):
ln -sfn /data/backups/ProjectA/$DATE /data/backups/ProjectA/latest
这样你就能在目标机上随时进入某一天的目录查看、对比、回滚文件。
同步不是“跑完就算”。建议至少做一次验证:
- 用 --itemize-changes 查看差异明细
rsync -avh --delete --dry-run --itemize-changes -e "ssh" ~/Work/ProjectA/ user@your-host:/data/backups/ProjectA/current/
- 遇到权限/所有者问题,优先检查目标目录权限;必要时先在同一用户下备份,避免跨用户写入。
更多参数说明可参考:https://ss64.com/osx/rsync.html
本文仅讨论合法的备份与同步。请只在你拥有访问权限的设备与目录之间操作;不要把密钥、Token 等敏感文件误同步到不可信主机。