木子月 發表於 2025-5-21 13:12:55

rsync 命令详解与示例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、rsync 命令核心功能与基本语法</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 核心功能</a></li><li><a href="#_lab2_0_1">2. 基本语法</a></li></ul><li><a href="#_label1">二、常用用例与命令示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1. 本地文件同步</a></li><li><a href="#_lab2_1_3">2. 远程同步(通过 SSH)</a></li><li><a href="#_lab2_1_4">3. 增量备份与镜像同步</a></li><li><a href="#_lab2_1_5">4. 排除/包含特定文件</a></li><li><a href="#_lab2_1_6">5. 性能优化与高级选项</a></li></ul><li><a href="#_label2">三、常见问题与解决方案</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_7">1. 权限问题:rsync: failed to open dir: Permission denied</a></li><li><a href="#_lab2_2_8">2. 误删文件:--delete&nbsp;意外删除目标文件</a></li><li><a href="#_lab2_2_9">3. 传输中断:网络不稳定导致同步失败</a></li><li><a href="#_lab2_2_10">4. 文件冲突:源与目标有同名但内容不同的文件</a></li><li><a href="#_lab2_2_11">5. 符号链接异常:同步后链接失效或指向错误</a></li><li><a href="#_lab2_2_12">6. 元数据丢失:权限/时间戳未正确保留</a></li><li><a href="#_lab2_2_13">7. 压缩无效:-z&nbsp;未减少传输量</a></li><li><a href="#_lab2_2_14">8. 网络连接超时:远程主机不可达</a></li></ul><li><a href="#_label3">四、最佳实践总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、rsync 命令核心功能与基本语法</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 核心功能</h3>
<ul><li><strong>增量同步</strong>:仅传输源文件与目标文件之间的差异部分,大幅减少数据传输量。</li><li><strong>跨平台支持</strong>:适用于本地文件系统、远程 SSH 或 rsync 协议连接的服务器。</li><li><strong>元数据保留</strong>:支持保留文件权限、时间戳、符号链接、硬链接等属性。</li><li><strong>灵活过滤</strong>:可通过正则表达式、排除/包含规则筛选同步文件。</li><li><strong>传输优化</strong>:支持压缩(<code>-z</code>)、带宽限制(<code>--bwlimit</code>)、断点续传(需配合工具)等。</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 基本语法</h3>
<div class="jb51code"><pre class="brush:plain;"># 本地同步语法
rsync [选项] [源路径] [目标路径]
# 远程同步语法(通过 SSH 协议)
rsync [选项] [源路径] [用户@]远程主机:[目标路径]
rsync [选项] [用户@]远程主机:[源路径] [目标路径]
# 远程同步语法(通过 rsync 守护进程协议)
rsync [选项] rsync://远程主机模块名/[目标路径]</pre></div>
<p><strong>核心参数分类</strong>:</p>
<ul><li><strong>模式参数</strong>:<br /><code>-a</code>(归档模式,等价于&nbsp;<code>-rlptgoD</code>,保留所有元数据并递归同步)<br /><code>-n</code>/<code>--dry-run</code>(模拟同步,不实际传输文件,用于测试)<br /><code>-v</code>/<code>-vv</code>(显示详细/更详细的同步过程)</li><li><strong>传输控制</strong>:<br /><code>-z</code>(压缩传输数据,提升网络传输效率)<br /><code>--delete</code>(删除目标中源不存在的文件,实现镜像同步)<br /><code>--ignore-errors</code>(忽略文件删除/读取错误,继续同步)</li><li><strong>过滤规则</strong>:<br /><code>--exclude=&quot;模式&quot;</code>(排除符合模式的文件/目录)<br /><code>--include=&quot;模式&quot;</code>(强制包含符合模式的文件/目录)</li><li><strong>性能优化</strong>:<br /><code>--bwlimit=KB/s</code>(限制传输带宽,如&nbsp;<code>--bwlimit=1024</code>)<br /><code>-P</code>(等价于&nbsp;<code>--partial --progress</code>,显示进度并保留部分传输文件)<br /><code>-D</code>(保留设备文件和特殊文件)</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、常用用例与命令示例</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1. 本地文件同步</h3>
<p>场景:将本地目录&nbsp;/data/source&nbsp;同步到&nbsp;/data/backup,保留所有属性并显示详细过程。</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av /data/source/ /data/backup/</pre></div>
<p>末尾斜杠&nbsp;/&nbsp;表示同步目录内的内容,目标目录不存在时会自动创建。</p>
<p>若源路径不带斜杠(如&nbsp;/data/source),目标目录会创建以&nbsp;source&nbsp;为名的子目录。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2. 远程同步(通过 SSH)</h3>
<p>场景 1:本地文件上传到远程服务器</p>
<div class="jb51code"><pre class="brush:ps;">rsync -avz /local/file.txt user@remote.server:/remote/path/</pre></div>
<p>-z&nbsp;压缩文件,适合网络传输;远程路径需用户有权限写入。</p>
<p>场景 2:从远程服务器下载文件</p>
<div class="jb51code"><pre class="brush:ps;">rsync -avz user@remote.server:/remote/file.txt /local/path/</pre></div>
<p>场景 3:跨服务器同步(无需本地中转)</p>
<div class="jb51code"><pre class="brush:ps;">rsync -avz -e "ssh -p 2222" user1@server1:/source/ user2@server2:/dest/</pre></div>
<p>-e&nbsp;指定使用 SSH 协议及端口(默认 22),支持加密传输。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>3. 增量备份与镜像同步</h3>
<p><strong>场景 1</strong>:增量备份(仅更新变化的文件,删除目标中多余文件)</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --delete /source/ /backup/</pre></div>
<p><code>--delete</code>&nbsp;会使目标与源严格一致,谨慎用于重要数据!建议先用&nbsp;<code>--dry-run</code>&nbsp;模拟。</p>
<p><strong>场景 2</strong>:保留历史版本的增量备份(使用硬链接节省空间)</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --link-dest=/backup/last/ /source/ /backup/current/</pre></div>
<p><code>--link-dest</code>&nbsp;让新备份共享上一次备份的相同文件,仅存储差异部分。</p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>4. 排除/包含特定文件</h3>
<p><strong>场景</strong>:同步目录时排除日志文件和临时文件</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --exclude="*.log" --exclude="tmp/" /data/ /backup/</pre></div>
<p>支持通配符(<code>*</code>、<code>?</code>)和目录路径(如&nbsp;<code>tmp/</code>&nbsp;表示排除整个目录)。</p>
<p>复杂过滤可使用&nbsp;<code>--exclude-from=文件</code>,在文件中每行写一个排除模式:</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --exclude-from=exclude.list /source/ /dest/</pre></div>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>5. 性能优化与高级选项</h3>
<p><strong>限速传输</strong>(避免影响带宽):</p>
<div class="jb51code"><pre class="brush:ps;">rsync -avz --bwlimit=2048 /large_data/ remote:/storage/</pre></div>
<p><strong>校验和模式</strong>(跳过时间戳检查,确保文件内容一致):</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --checksum /source/ /dest/</pre></div>
<p><strong>保留符号链接</strong>(默认保留,若需跟随链接同步实际文件,加&nbsp;<code>--follow-symlinks</code>):</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --follow-symlinks /source/ /dest/</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、常见问题与解决方案</h2>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>1. 权限问题:rsync: failed to open dir: Permission denied</h3>
<p><strong>原因</strong>:源/目标目录无读取/写入权限,或远程用户权限不足。</p>
<p><strong>解决</strong>:</p>
<p>本地同步:使用&nbsp;<code>sudo</code>&nbsp;提升权限,或确保用户对路径有对应权限。</p>
<p>远程同步:检查远程用户是否为目录所有者,或使用&nbsp;<code>ssh-keygen</code>&nbsp;配置无密码登录避免权限中断。</p>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>2. 误删文件:--delete&nbsp;意外删除目标文件</h3>
<p><strong>预防</strong>:</p>
<p>永远先用&nbsp;<code>--dry-run</code>&nbsp;模拟同步,确认输出中无错误删除操作:</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --delete --dry-run /source/ /dest/</pre></div>
<p>重要数据先备份目标目录,或使用&nbsp;<code>--delete-after</code>(先传输新文件再删除,减少风险)。</p>
<p class="maodian"><a name="_lab2_2_9"></a></p><h3>3. 传输中断:网络不稳定导致同步失败</h3>
<p><strong>解决</strong>:</p>
<p>使用&nbsp;<code>-P</code>(<code>--partial</code>)保留未完成传输的临时文件,支持断点续传:</p>
<div class="jb51code"><pre class="brush:ps;">rsync -avP /large_file.iso remote:/dest/</pre></div>
<p>若频繁中断,可搭配&nbsp;<code>rsync</code>&nbsp;+&nbsp;<code>nohup</code>&nbsp;或&nbsp;<code>screen</code>&nbsp;保持会话持续。</p>
<p class="maodian"><a name="_lab2_2_10"></a></p><h3>4. 文件冲突:源与目标有同名但内容不同的文件</h3>
<p><strong>现象</strong>:<code>rsync</code>&nbsp;默认以源文件覆盖目标文件,可能导致数据丢失。</p>
<p><strong>解决</strong>:</p>
<p>使用&nbsp;<code>--compare-dest=参考目录</code>&nbsp;对比三方文件,优先保留最新版本(需&nbsp;<code>rsync &gt;= 3.1.0</code>):</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --compare-dest=/reference/ /source/ /dest/</pre></div>
<p>手动检查冲突文件(通过&nbsp;<code>--itemize-changes</code>&nbsp;输出详细差异):</p>
<p>bash</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --itemize-changes /source/ /dest/</pre></div>
<p class="maodian"><a name="_lab2_2_11"></a></p><h3>5. 符号链接异常:同步后链接失效或指向错误</h3>
<p><strong>原因</strong>:默认&nbsp;<code>rsync</code>&nbsp;保留符号链接本身,不跟随其指向的文件。</p>
<p><strong>解决</strong>:</p>
<p>若需保留链接(推荐):无需额外参数,默认行为正确。</p>
<p>若需同步链接指向的实际文件:添加&nbsp;<code>--follow-symlinks</code>,但可能导致循环链接错误。</p>
<p class="maodian"><a name="_lab2_2_12"></a></p><h3>6. 元数据丢失:权限/时间戳未正确保留</h3>
<p><strong>原因</strong>:未使用归档模式&nbsp;<code>-a</code>,或远程服务器限制权限写入。</p>
<p><strong>解决</strong>:</p>
<p>始终使用&nbsp;<code>-a</code>&nbsp;或显式添加&nbsp;<code>-rltp</code>(递归、保留符号链接、时间戳、权限)。</p>
<p>远程同步时,确保目标用户有&nbsp;<code>chmod</code>/<code>chown</code>&nbsp;权限(如使用 root 用户或&nbsp;<code>sudo</code>)。</p>
<p class="maodian"><a name="_lab2_2_13"></a></p><h3>7. 压缩无效:-z&nbsp;未减少传输量</h3>
<p><strong>原因</strong>:传输的文件已是压缩格式(如&nbsp;<code>.zip</code>、<code>.tar.gz</code>),压缩反而增加开销。</p>
<p><strong>解决</strong>:对二进制或文本文件用&nbsp;<code>-z</code>,对已压缩文件改用&nbsp;<code>-z0</code>(最小压缩)或直接禁用&nbsp;<code>-z</code>。</p>
<p class="maodian"><a name="_lab2_2_14"></a></p><h3>8. 网络连接超时:远程主机不可达</h3>
<p><strong>原因</strong>:SSH 端口错误、防火墙阻止连接、主机名解析失败。</p>
<p><strong>解决</strong>:</p>
<p>检查远程主机 IP/端口(<code>ping remote.server</code>&nbsp;或&nbsp;<code>ssh user@remote.server -p 端口</code>)。</p>
<p>添加&nbsp;<code>-e &quot;ssh -o ConnectTimeout=10&quot;</code>&nbsp;限制连接超时时间:</p>
<div class="jb51code"><pre class="brush:xhtml;">rsync -avz -e "ssh -o ConnectTimeout=10" /local/ remote:/dest/</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、最佳实践总结</h2>
<p><strong>测试优先</strong>:复杂同步任务先用&nbsp;<code>--dry-run</code>&nbsp;模拟,确认输出无误后再执行。</p>
<p><strong>备份关键数据</strong>:对重要目录同步前,手动备份目标数据(尤其是含&nbsp;<code>--delete</code>&nbsp;的操作)。</p>
<p><strong>日志记录</strong>:通过&nbsp;<code>--log-file=rsync.log</code>&nbsp;记录同步过程,方便后续审计或排错:</p>
<div class="jb51code"><pre class="brush:ps;">rsync -av --delete --log-file=sync.log /source/ /dest/</pre></div>
<p><strong>版本控制</strong>:结合&nbsp;<code>--link-dest</code>&nbsp;实现基于硬链接的版本化备份,节省存储空间。</p>
<p>通过掌握上述用法,可高效利用 rsync 完成本地/远程文件同步、增量备份、服务器镜像等任务,同时避免常见陷阱。实际使用中建议根据具体场景调整参数,必要时查阅官方文档(<code>man rsync</code>)获取完整选项说明。&nbsp;</p>
頁: [1]
查看完整版本: rsync 命令详解与示例