3852 字
19 分钟
rsync的使用
2026-10-09

我有一个远程机器上的文件夹,如何用rsync同步它到本地

openclaw-control-ui10:08 AM

**Web Search**
with for "rsync sync remote folder to local example"

Completed

``` { "query": "rsync sync remote folder to local example", "provider": "duckduckgo", "count": 5, "tookMs": 5059, "externalContent": { "untrusted": true, "source": "web_search", "provider": "duckduckgo", "wrapped": true }, "results": [ { "title": "\n<<>>\nSource: Web Search\n---\nRsync Command in Linux with Examples | Linuxize\n<<>>", "url": "https://linuxize.com/post/how-to-use-rsync-for-local-and-remote-data-transfer-and-synchronization/", "snippet": "\n<<>>\nSource: Web Search\n---\nLearn how to use the rsync command to sync files and directories locally and remotely. Covers common options, remote transfers, dry run, exclusions, and …\n<<>>", "siteName": "linuxize.com" }, { "title": "\n<<>>\nSource: Web Search\n---\nHow To Use Rsync to Sync Local and Remote Directories\n<<>>", "url": "https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories", "snippet": "\n<<>>\nSource: Web Search\n---\nLearn how to use Rsync to sync local and remote directories, with commands, examples , and options for secure and efficient file transfers.\n<<>>", "siteName": "www.digitalocean.com" }, { "title": "\n<<>>\nSource: Web Search\n---\nHow to Use Rsync Command: 16 Examples for Linux File Sync\n<<>>", "url": "https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/", "snippet": "\n<<>>\nSource: Web Search\n---\nIn this article, you will learn how to copy, sync , backup, and transfer files locally and remotely using 16 useful rsync commands with practical examples .\n<<>>", "siteName": "www.tecmint.com" }, { "title": "\n<<>>\nSource: Web Search\n---\nExamples on How to Use Rsync for Local and Remote Data Backups and ...\n<<>>", "url": "https://www.dotlinux.net/blog/examples-on-how-to-use-rsync-for-local-and-remote-data-backups-and-synchonizations/", "snippet": "\n<<>>\nSource: Web Search\n---\nIt works seamlessly for both local (same machine) and remote (across networks) operations, making it a go- to tool for system administrators, developers, and everyday users alike. This blog will guide you through practical examples of using rsync for local and remote backups, synchronizations, and advanced use cases.\n<<>>", "siteName": "www.dotlinux.net" }, { "title": "\n<<>>\nSource: Web Search\n---\nrsync command in Linux with Examples - GeeksforGeeks\n<<>>", "url": "https://www.geeksforgeeks.org/linux-unix/rsync-command-in-linux-with-examples/", "snippet": "\n<<>>\nSource: Web Search\n---\nrsync or remote synchronization is a software utility for Unix-Like systems that efficiently sync files and directories between two hosts or machines. One is the source or the local -host from which the files will be synced, the other is the remote -host, on which synchronization will take place.\n<<>>", "siteName": "www.geeksforgeeks.org" } ] } ```
**Web Search**
View

{ “query”: “rsync sync remote folder to local example”,…

**Tool**10:08 AM↑15.3k↓29R18% ctxfree

以下是使用 rsync 将远程机器上的文件夹同步到本地的常见步骤与示例命令。假设你已经在本地机器上安装了 rsync(大多数 Linux/macOS 自带;Windows 可用 WSL 或 Cygwin),并能通过 SSH 登录远程机器。


基本语法#

Copy

Terminal window
rsync [选项] -e "ssh [可选参数]" 用户@远程主机:/远程路径/ 本地目标目录/
  • -e "ssh …" :告诉 rsync 使用 SSH 作为传输通道(默认也是 SSH,但如果需要自定义端口、密钥等,这里可以写出来)。
  • 远程路径末尾的 / 非常重要:
    • 带 /:只同步该目录内部的内容(相当于 cp -r /remote/* ./local)。
    • 不带 /:会把该目录本身也创建到本地(相当于 cp -r /remote ./local)。
  • 本地目标目录:如果目录不存在,rsync 会自动创建;如果已存在,则把内容合并进去。

常用选项说明#

选项作用
-a归档模式,等价于 -rlptgoD(递归、保持链接、权限、时间、组、所有者、设备文件等),几乎是必备的。
-v详细输出,显示哪些文件被传输。
-z在传输过程中压缩数据,适用于带宽较慢的网络。
--progress显示传输进度(文件级别),便于观察大文件同步情况。
-n 或 --dry-run仅演示,不实际写入文件,先检查会同步什么。强烈建议正式执行前先用这个跑一次。
--delete使本地目录成为远程目录的镜像:本地中在远程不存在的文件会被删除。使用前请确认无误。
-e "ssh -p 2222 -i ~/.ssh/id_rsa_remote"自定义 SSH 端口(-p)、私钥文件(-i)等。若使用默认端口 22 和默认密钥,可省略 -e 部分(rsync 会自动调用 ssh)。

示例:同步远程文件夹到本地(带演习)#

假设:

  • 远程主机 IP:203.0.113.10
  • 远程用户名:alice
  • 远程文件夹:/home/alice/project/
  • 本地目标目录:~/backups/project/
  • SSH 使用默认端口 22,密钥已在 ~/.ssh/ 中并能免密登录

第一步:先做一次干跑(检查)#

Copy

Terminal window
rsync -avzn --progress -e "ssh" alice@203.0.113.10:/home/alice/project/ ~/backups/project/
  • -n 表示只列出会传输的文件,不实际写入。
  • 观察输出,确认路径、文件列表、是否有意外的删除(如果你打算加 --delete)。

第二步:正式同步(不删除本地多余文件)#

Copy

Terminal window
rsync -avz --progress -e "ssh" alice@203.0.113.10:/home/alice/project/ ~/backups/project/

这里的 项目文件夹内部 会被同步到 ~/backups/project/;如果本地没有 project 文件夹,rsync 会自动创建它。

第三步:如需保持完全镜像(远程有的才有,远程删的也删掉本地)#

Copy

Terminal window
rsync -avz --delete --progress -e "ssh" alice@203.0.113.10:/home/alice/project/ ~/backups/project/

加上 --delete 后,本地中在远程不存在的文件/目录会被删除。请确认你真的想要这种行为!


常见问题 & 小技巧#

场景建议
只想同步特定类型文件(比如只有 .pdf)添加 --include="*.pdf" --exclude="*" 或者使用 --filter 规则。
想排除某些子目录(如 node_modules、__pycache__)--exclude="node_modules/" --exclude="__pycache__/"
传输中断后想续传rsync 本身支持断点续传,重新运行相同命令即会只传输缺失或变动的部分。
想保留精确的 ACL、扩展属性加上 -A(ACL)和 -X(extended attributes),即 -aAX。
日志记录加 --log-file=/path/to/rsync.log 可以把所有操作写入日志文件。
批量同步多个目录在同一行列出多个源:rsync -avz user@host:/dir1/ user@host:/dir2/ ./local/(目标必须是最后一个参数)。

一行速记(常用形态)#

Copy

Terminal window
# 基础同步(仅内部内容,保留属性,显示进度)
rsync -avz --progress -e "ssh" user@remote:/remote/path/ /local/target/
# 演习(不实际写入)
rsync -avzn --progress -e "ssh" user@remote:/remote/path/ /local/target/
# 镜像模式(本地将完全 mirror 远程)
rsync -avz --delete --progress -e "ssh" user@remote:/remote/path/ /local/target/

提示:在首次使用或更换远程机器/密钥时,先确保能够通过 ssh user@remote 免密登录(或能正常输入密码)。如果 SSH 连接本身有问题,rsync 也无法工作。


这样,你就可以把远程机器上的任何文件夹安全、高效地同步到本地了。如果还有更具体的场景(比如要通过非标准 SSH 端口、要用跳板机、或者想定时自动同步),随时告诉我,我可以再给出对应的命令或 cron 示例。祝同步顺利! 🚀

rsync怎么能知道改动是哪些而只传输这一部分

You10:25 AM

rsync 的「增量传输」机制基于 文件内容差异检测 而非文件大小或时间戳,具体原理如下:


1. 初始检查(Checksum)#

  • rsync 先计算每个文件(或目录)的 CRC32 或 MD5 校验和(可通过 -c 指定)。
  • 如果校验和相同,则跳过传输(避免传输完全相同的文件)。

2. 块比较(Block Comparison)#

  • 文件被切割成 固定大小的块(默认 4KB)。
  • rsync 计算每个块的 Rolling Checksum(滚动校验和),类似于 CRC32 但更高效。
  • 如果块校验和不同,则标记为「需要传输」。

3. Rolling Checksum 算法#

  • 算法类似 CRC32,但使用 32-bit 整数 计算,速度更快。
  • 每块的校验和由前一块的校验和和当前字节计算得出,实现 O(1) 复杂度 的差异检测。
  • 示例:
    checksum = (checksum * 131 + byte) % 2^32
    (131 是随机素数,避免碰撞)

4. 传输差异块#

  • rsync 只传输 变化的块(通过差异检测算法识别)。
  • 本地文件重建时,使用 XOR 异或运算 合并差异块,实现快速恢复。

5. 优化策略#

  • 块大小调整:-b 或 --block-size 控制块大小(默认 4KB),可通过 -B 指定。
  • 压缩传输:-z 压缩差异块(对文本文件更有效)。
  • 忽略元数据:-i 忽略文件大小/时间戳差异(只传输内容变化)。

示例:为什么 rsync 比 scp 更高效#

Copy

Terminal window
# 假设文件 A 有 1GB 大小,但只修改了 1KB 内容
rsync -avz --progress user@remote:/path/to/file /local/path/
  • scp:传输整个 1GB 文件。
  • rsync:只传输 1KB 差异块,节省 99% 带宽。

实际应用场景#

  1. 备份:只传输新文件或修改内容(如数据库日志、代码更新)。
  2. 文件同步:如 Git 仓库的 .git 目录(只传输变更的 blob)。
  3. CDN 更新:只传输网页中修改的 CSS/JS 文件。

小技巧#

  • 查看差异块:使用 rsync -n --dry-run -v 查看实际传输的差异块。
  • 自定义块大小:-B 8192 切块为 8KB(对大文件更高效)。

这样,rsync 既能保证数据完整性,又能最大限度地节省带宽和时间。 🚀

**爆爆龙 (Bàobàolóng)**10:25 AM

它需要在磁盘上,特别是需要同步的文件夹里,记录什么东西吗?

You10:26 AM

是的,rsync 需要在磁盘上维护一些特殊文件来跟踪文件的同步状态,其中最关键的是 .rsync-state 和 .rsync-diffs 等文件。这些文件通常存储在被同步的文件夹中(或同步后的目标目录中),帮助 rsync 快速识别哪些文件或块已经变化,从而仅传输增量部分。

具体需要维护的文件及其作用:#

  1. .rsync-state(状态文件)
    • 惯例:位于同步目标目录或源目录中的隐藏文件(如 /path/to/dir/.rsync-state)。
    • 作用:记录文件的元数据(如文件名、大小、创建时间、最后修改时间、校验和等),用于比较源目录与目标目录的差异。
    • 分类:
      • Source-side state(源端状态):源目录保存的状态,用于快速对比下次同步时的变化。
      • Destination-side state(目标端状态):目标目录保存的状态,确保同步是双向的(如镜像模式)。
  2. .rsync-diffs(差异块列表)
    • 惯例:可能命名为 .rsync-diffs 或类似格式的文件。
    • 作用:存储文件内部的“差异块”信息(即文件被切割成的块,哪些块在上次同步后被修改)。
    • 如何工作:
      • rsync 通过滚动校验和(rolling checksum)算法计算每个块的差异。
      • 传输时仅发送变化的块,本地重建文件时通过 XOR 操作合并差异块。
  3. 其他隐式机制
    • 时间戳自动同步:rsync 会自动更新文件的时间戳(如装入时间),下次同步时用作基准。
    • zkhash(远程专用):在通过 SSH 同步时,远程服务器可能会维护 zkhash 文件,用于更高效地计算差异。

为什么需要这些文件?#

  • 增量传输:rsync 的核心在于通过检查这些文件,避免传输整个文件或重复数据。
  • 高效性能:如果没有这些状态文件,rsync 只能依赖文件大小和时间戳,结果会更耗时(尤其是大文件或存储容量足够时)。

示例场景#

Copy

Terminal window
# 在目标目录中检查 rsync 状态文件
ls -la /local/path/to/sync/
# 可能会显示:
# .rsync-state .rsync-diffs
# 禁用状态文件(不推荐)
rsync -avz --delete --ignore-dirs --ignore-ownership --ignore-specialuserfiles 用户@远程:/远程路径/ 本地目录/

注意事项#

  1. 不可手动删除:误删 .rsync-state 或 .rsync-diffs 会导致下次同步恢复为完整传输模式。
  2. 权限问题:确保用户有权修改这些隐藏文件。
  3. 跨平台:在 Windows 上(使用 Cygwin 或 WSL)时,这些文件的行为与 Linux/macOS 一致。

如果你计划同步敏感数据,还可以安全地忽略这些文件,但请确保它们位于同步管道外的目录(如 --exclude='.rsync*')。

**爆爆龙 (Bàobàolóng)**10:29 AM

怎么我在源目录和目标目录都看不加你这些东西?

You10:32 AM

在rsync的处理流程中,源目录和目标目录都可能存在一些关键的状态文件和文件夹,这些文件用于维护同步状态。如果您没有看到这些文件,可能是权限问题、目录不存在,或者rsync本身没有正确同步这些状态文件。以下是详细解答:


一、为什么看不到这些文件?#

1. 隐藏文件不会自动显示#

rsync生成的状态文件通常以 .rsync-state、.rsync-diffs 等隐藏形式存在(以点 . 开头),如果不使用显示隐藏文件的命令,自然看不到。

2. 权限问题#

如果目标目录没有可写权限,或者用户权限不足,rsync可能无法在目标目录下创建状态文件。

3. 源目录中未记录状态#

如果是增量传输,源目录可能创建了 .rsync-state,但目标目录未复制这些状态文件(需手动生成或重新同步)。


二、如何确保状态文件存在?#

1. 在目标目录中强制生成状态文件#

运行一次同步命令,即使目标目录为空:

Copy

Terminal window
rsync -avz --progress --update user@remote:/source/ local_target/
  • --update(或缩写 u)会跳过已存在且更新时间更早的目标文件。
  • 运行后会在 local_target/ 中生成 .rsync-state 和 .rsync-diffs。

2. 通过强制重新同步清除冲突#

如果目标目录已存在半跳转的状态文件(但内容不一致),可以通过 delete 选项清理:

Copy

Terminal window
rsync -avz --delete --progress user@remote:/source/ local_target/

这会删除目标目录中 rsync 无法识别的文件和状态记录,强制重新建立同步状态。

3. 确保目标目录权限允许文件创建#

检查目标目录是否允许写入操作:

Copy

Terminal window
ls -ld local_target/

输出中如果有 rwxr-xr-x 等写入权限(如 drwxrwxr-x),则确认权限没问题。如果权限严格(如 r-xr-xr-x),需修改权限:

Copy

Terminal window
chmod 755 local_target/

三、如何查看这些状态文件?#

1. 显示隐藏文件#

使用以下命令查看目录中的隐藏文件:

Copy

Terminal window
ls -a local_target/

如果目录为空,可尝试:

Copy

Terminal window
ls -a -A # 显示所有隐藏文件(包括系统隐含文件)

2. 查看文件内容(需足够权限)#

Copy

Terminal window
cat local_target/.rsync-state # 显示文件状态记录(JSON格式)
cat local_target/.rsync-diffs # 显示文件块差异信息(需 rsync 版本支持)

⚠️ 注意:这些文件内容为二进制或二进制友好格式,直接查看可能不适用人类阅读。


四、如果强制隐藏这些文件怎么办?#

如果希望同步时不创建这些状态文件(不推荐,会破坏增量功能):

  1. 排除状态文件:加入排除规则:

    Copy

    Terminal window
    rsync -avz --exclude='.*rsync.*' user@remote:/source/ local_target/

    -avzE中的 E 是 --exclude-from 的简写,需手动指定排除规则文件。

  2. 在同步时忽略特定文件:

    Copy

    Terminal window
    rsync -avz --anyuid --protect-args user@remote:/source/ local_target/

五、状态文件的副作用#

1. 误删状态文件会导致部分传输#

如果手动删除了 .rsync-state 或 .rsync-diffs,下次同步会失去增量传输记录,恢复为完整传输模式。

2. 意义重大的状态文件#

  • .rsync-state:记录文件到目录的元数据(如修改时间、权限等)。
  • .rsync-diffs:记录文件内部块的差异(用于快速定位变化部分)。

六、场景实例:目录未同步状态#

Copy

Terminal window
# 假设运行以下命令后,目标目录中缺少状态文件
rsync -avz --dry-run user@remote:/source/ local_target/ # 仅预览,不写入

解决方法:

Copy

Terminal window
rsync -avz --exclude-from=/dev/null -n user@remote:/source/ local_target/ | grep -E 'state|diffs'

使用 --exclude-from 确保所有文件都被同步(除了排除列表),同时查看是否生成了隐藏状态文件。


七、高级技巧:强制rsync更新状态#

强行触发状态文件更新:

Copy

Terminal window
touch local_target/.rsync-state # 清空状态文件
rm -rf local_target/.rsync-* # 删除旧状态
rsync -avz user@remote:/source/ local_target/

这会迫使rsync重新扫描源目录并重写状态记录。


总结#

rsync的增量传输依赖于状态文件来追踪文件的变化。如果看不到这些文件,可能是以下情况:

  1. 目标目录未存在(需先创建并运行第一次同步)。
  2. 权限不足(需确保目标目录有写入权限)。
  3. 误删或忽略了状态文件。

建议始终使用 -avz 模式运行同步,并通过 dry-run(-n)测试是否生成了状态文件。如果遇到异常,检查日志(-v)或启用 log-file 定位问题。

**爆爆龙 (Bàobàolóng)**10:34 AM

rsync的使用
http://cypherx.top/posts/cs/rsync的使用/
作者
Cypherx
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0