在 macOS 本地或远端之间做增量同步,保留权限和扩展属性。
rsync 只传输差异部分,适合备份、部署和大目录同步。macOS 的系统版本差异很大:macOS 14 及更早自带 Apple 修补的 rsync 2.6.9,支持用 -E 保留扩展属性、ACL 和资源分支;macOS 15 起系统自带的是 openrsync,rsync --version 会显示 “rsync version 2.6.9 compatible”,常用选项可用,但缺少 --info=progress2、--acls、--xattrs 等完整 rsync 特性。需要这些能力时用 brew install rsync,并确认脚本调用的是 Homebrew 的路径。
源路径末尾的斜杠决定语义:src/ 同步的是目录内容,src 会在目标下创建 src 目录。执行前先 -n(dry-run)确认文件列表,配合 -av 看将被删除或修改的条目。--delete 只影响目标端,但方向写反或源路径写错会清空目标,生产环境必须加 --dry-run 和 --max-delete 保护。
macOS 的 -a 只包含常规权限、时间、符号链接等,不包含扩展属性和 ACL;本机备份用 -aE,跨平台到 Linux 时 -E 可能不被识别,应改用 Linux 侧的 -AX 或接受属性丢失。APFS 默认大小写不敏感,和区分大小写的 Linux 目录同步时可能出现同名冲突。
# 先确认系统 rsync 的类型和版本
% rsync --version
# 演练:只列出将发生的变化,不写目标
% rsync -avn ./src/ /Volumes/Backup/src/
# 本机备份,保留扩展属性和 ACL
% rsync -aE ./src/ /Volumes/Backup/src/
# 同步到远端并删除目标端多余文件;先 dry-run
% rsync -avn --delete --exclude '.DS_Store' ./src/ user@host:/srv/src/
% rsync -av --delete --exclude '.DS_Store' ./src/ user@host:/srv/src/
# 指定 SSH 端口
% rsync -av -e 'ssh -p 2222' ./src/ user@host:/srv/src/
# 大文件支持断点续传和进度
% rsync -av --partial --progress ./big.iso user@host:/data/
# 覆盖前保留旧版本到备份目录
% rsync -av --backup --backup-dir=../bak ./config/ /srv/config/
-n 看目标路径是否符合预期。--delete 方向写反或源目录为空会清空目标;先 dry-run,再加 --max-delete=100 限制单次删除量。unknown option --info=progress2 或 --acls:说明不是完整 rsync,改用 brew install rsync 并调整 PATH,或退回 --progress。-a 会丢失扩展属性、ACL 和资源分支;macOS 本机备份用 -aE,并确认目标文件系统支持这些属性。--rsync-path=/usr/local/bin/rsync 指定远端二进制。Readme 和 README 在本地视为同一文件;与 Linux 同步前先检查命名冲突。合上页面,先回答,再展开对照。
rsync -a src/ dest/ 和 rsync -a src dest/ 有什么区别?--info=progress2 可能报未知选项?--delete 前应该做哪些保护?src/ 同步目录内容到 dest/ 下;src 会在 dest/ 下创建 src 子目录,结果多一层。--info=progress2;需要完整特性应安装 Homebrew rsync。-n dry-run 核对文件列表,确认源路径和方向,再加 --max-delete 限制删除量,重要数据先做备份。
小程序版
微信扫码,随时查命令