Rysnc 指南和 11 个有效使用它的示例

深入解析 rsync:一款强大的文件同步工具

Rsync 是一款免费且功能强大的命令行实用程序,它允许用户在本地和远程系统之间同步文件和目录。 这项工具在数据迁移、备份和镜像等任务中表现出色,尤其适合需要重复数据传输的网站管理员和系统管理员。

本文将详细介绍 rsync 的工作机制,并提供一些实用的示例,以帮助您更好地理解和使用这款强大的工具。

Rsync 的工作原理

Rsync 是一种为类 Unix 系统设计的远程同步命令行工具。它能够让用户在同一台机器上的不同位置,或者在不同的主机之间,无缝地传输和同步文件。

Rsync 的核心在于其增量传输算法。这个算法的工作原理是:它只复制源文件和目标文件之间的差异部分,而不是整个文件。源和目标可以是本地目录或远程主机。 rsync 可以通过两种主要的方式来执行复制和同步操作:

  • 通过 SSH 或 rsh 等协议在两台主机之间进行复制/同步。
  • 通过 TCP rsync 守护进程进行复制/同步。

由于 rsync 是为类 Unix 系统设计的,因此它在 Linux 系统中也能够良好运行。

Rsync 的同步过程如下:

  • Rsync 首先使用 SSH 连接到远程主机,并要求输入密码(如果需要)。
  • 连接建立后,远程主机的 rsync 进程与源主机通信。
  • 然后,这些进程会确定需要同步的文件和目录。它利用增量传输算法来检查文件之间的差异。

如果在远程主机上找到的文件在目标主机上不存在,rsync 将会复制并将其传输到目标系统。如果目标主机上已经存在相同的文件,则 rsync 只会复制文件之间的差异部分。如果两个系统上的文件完全相同,rsync 将会忽略它们而不做任何修改。

Rsync 通过将差异部分存储在临时文件中来实现增量更新,然后再将其推送到目标位置。

在使用 rsync 之前,您需要确保满足以下条件:

  • 您需要 root 或 sudo 权限。
  • 您需要访问终端/命令行。
  • 您需要 SSH 访问权限才能安全地执行 rsync 命令。
  • 您还需要至少两台计算机才能进行 rsync 同步操作。

在本教程中,我们将使用 Linux Mint 21.1 Vera 作为演示系统。 您也可以使用其他 Linux 发行版,按照本教程进行操作,不会遇到任何问题。

为什么选择 rsync 而不是 scp?

Scp(安全复制)是一种常见的命令行协议,用于复制文件。 它采用线性复制方式,这意味着它会将整个文件从源复制到目标。为了保证安全性,scp 使用 SSH 协议。

scp 命令的语法如下:

scp [选项] 源文件 目标文件

那么,为什么我们要使用 rsync 而不是 scp 呢?

使用 rsync 有诸多优势,包括:

  • 更快的执行速度:Rsync 比 scp 快,因为它采用远程更新协议。 这意味着 rsync 只传输文件的差异部分,而不是整个文件。 因此,如果您定期进行同步,那么只有第一次需要完整复制,之后每次都只会复制更新的部分。
  • 减少带宽消耗:由于 rsync 不需要重复复制整个文件,因此可以显著减少带宽消耗。 此外,它还使用压缩/解压缩算法来进一步减小传输过程中文件的大小。
  • 更多命令行选项:Rsync 提供了比 scp 更多的命令行选项,这意味着您可以更精细地控制 rsync 的行为。

总而言之,rsync 是一款出色的增量同步工具。 scp 也能够安全地传输和同步文件。在实际应用中,如果您需要一种直接的文件复制方法,scp 可以满足日常需求。但是,对于重复性任务,rsync 则是更好的选择。

Rsync 命令语法

rsync 命令的基本格式如下:

rsync [选项] 源地址 目标地址

其中:

  • 选项: 用于提供附加功能的参数。
  • 源地址: 源目录或文件。
  • 目标地址: 目标目录或文件。
  • USER:远程用户名。
  • HOST:远程主机名或 IP 地址。

选项是为命令提供附加功能的参数。 例如,您可以使用 -r 选项递归地同步数据。 然而, -r 选项不会同步组和用户的所有权、时间戳、权限或符号链接。 因此,您可以使用 -a 选项,该选项以存档模式运行命令,确保在复制时保留所有文件的所有权、权限和符号链接。

其他常用的 rsync 选项包括:

  • -z:压缩数据以节省空间。
  • -h:以人类可读的格式输出。
  • -b:在数据同步过程中进行备份。
  • -e:使用 SSH 协议进行远程数据传输。
  • --progress:显示数据同步进度。
  • -v:要求 rsync 显示详细输出。
  • --n:执行模拟运行,以测试数据同步的设置。
  • -q:抑制 rsync 命令的输出和选项。

安装 rsync

大多数 Unix 和 Linux 系统都预装了 rsync。如果您的系统没有安装 rsync,您可以使用以下命令进行安装:

系统 安装命令
Debian/Ubuntu 和 Mint sudo apt-get install rsync
Arch Linux pacman -S rsync
Gentoo emerge sys-apps/rsync
CentOS/Fedora/REHL sudo yum install rsync
openSUSE sudo zypper install rsync

由于我们使用的是 Linux Mint,所以 rsync 已经预装。您可以在终端运行 rsync 命令来验证是否安装。如果已安装,它将显示其功能、选项和其他相关信息。

    
      nitt ~
      $ rsync
      rsync  version 3.2.3  protocol version 31
      Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
      Web site: https://rsync.samba.org/
      Capabilities:
          64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
          socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
          batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
          symtimes, prealloc, stop-at, no crtimes
      Optimizations:
          SIMD, no asm, openssl-crypto
      Checksum list:
          xxh128 xxh3 xxh64 (xxhash) md5 md4 none
      Compress list:
          zstd lz4 zlibx zlib none

      rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
      are welcome to redistribute it under certain conditions.  See the GNU
      General Public Licence for details.

      rsync is a file transfer program capable of efficient remote update
      via a fast differencing algorithm.
    
    

接下来,我们将了解 rsync 在不同场景中的实际应用。

在本教程中,我们将创建两个目录:

  • 源目录
  • 目标目录

使用以下命令创建这两个目录:

    
    mkdir source-directory
    mkdir dest-directory
    
  

为了方便演示,我们还需要创建一些测试文件。使用以下命令在源目录中创建 100 个空文件:

      
        touch source-directory/file{1..100}
      
    

您可以通过以下命令来确认文件已创建:

      
        ls source-directory
        Output:
        nitt rsync-tutorial
        $ ls
        dest-directory  source-directory
        nitt rsync-tutorial
        $ touch source-directory/file{1..100}
        nitt rsync-tutorial
        $ ls source-directory
        file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
        file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
        file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
        file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
        file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
        file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
        file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
        file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
        file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
        file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
      
    

请注意,我们将目标目录保持为空。

在本地递归地复制目录

尽管 rsync 的主要功能是在本地和远程服务器之间同步文件,但它同样适用于在本地复制文件。

在这种情况下,我们将使用以下 rsync 语法:

rsync [选项] 源目录 目标目录

运行以下命令,将源目录中的文件复制到目标目录:

    
    rsync -r source-directory/ dest-directory
    
  

此命令会将源目录中的所有文件和子目录递归地复制到目标目录。

    
      nitt rsync-tutorial
      $ ls
      dest-directory  source-directory
      nitt rsync-tutorial
      $ ls dest-directory
      nitt rsync-tutorial
      $ ls source-directory
      file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
      file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
      file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
      file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
      file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
      file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
      file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
      file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
      file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
      file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
      nitt rsync-tutorial
      $ rsync -r source-directory/ dest-directory
      nitt rsync-tutorial
      $ ls dest-directory
      file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
      file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
      file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
      file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
      file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
      file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
      file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
      file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
      file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
      file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
    
  

在本地复制单个文件

现在,我们已经了解了如何同步两个目录,接下来我们将学习如何复制单个文件。

为此,我们将编辑源目录中的空文件 file1,并将其同步到目标目录中的相同文件。

要编辑文件,请键入以下命令:

      
      nano source-directory/file1
      
    

将以下文本复制并粘贴到 nano 编辑器中:

    
      We're updating file1 in the source-directory.
      Once we update, we'll push the new update to the dest-directory.
      rsync doesn't need to re-copy the file using the delta-transfer algorithm.
      This algorithm checks the differences and then updates destination files
      accordingly.
      So, once you save file1 in the source-directory, open file1 in
      the dest-directory. It'll be empty.
      However, if we check it after running rsync, you'll see that file1 in dest-directory
      is updated.
    
  

现在,关闭并保存文件。

现在让我们使用 rsync 复制文件:

    
    sudo rsync -v --existing source-directory/file1 dest-directory
    
  
    
      #Output
      nitt rsync-tutorial
      $ sudo rsync -v --existing source-directory/file1 dest-directory
      file1

      sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
      total size is 474  speedup is 0.80

      nitt rsync-tutorial
      $ 
    
  

您可能已经注意到,我们使用了 --existing 选项,它用于更新已存在的文件。 如果在不使用 --existing 选项的情况下运行此命令,即便它运行成功,目标文件也不会被更新。

如果目标文件夹中不存在您要复制的单个文件,则需要运行以下命令:

    
      rsync -v source-directory/newfile dest-directory
    
  
    
      #Output
      nitt rsync-tutorial
      $ rsync -v source-directory/newfile dest-directory
      newfile

      sent 82 bytes  received 35 bytes  234.00 bytes/sec
      total size is 0  speedup is 0.00
    
  

复制多个文件

如果您要复制多个文件,则必须指定每个文件的源路径,然后指定目标目录。

为此,我们将在源目录中创建两个新文件:newfile2newfile3。 使用以下命令执行此操作:

    
    touch source-directory/newfile{2..3}
    
  

现在,使用以下命令同步多个文件:

    
    rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
    
  
      
        #Output
        nitt rsync-tutorial
        $ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
        newfile2
        newfile3

        sent 135 bytes  received 54 bytes  378.00 bytes/sec
        total size is 0  speedup is 0.00
        nitt rsync-tutorial
        $ 
      
  

将文件或目录从本地复制到远程

将文件从本地复制到远程的 rsync 语法如下:

    
      rsync [选项] 源地址 [email protected]:目标地址
    
  

您需要知道远程计算机的 IP 地址才能完成此操作。 您还需要在源文件之后添加 IP 地址。

      
        rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
      
    

在开始传输之前,系统会提示您输入密码。 输入密码继续。 此外,如果远程计算机上的用户名不同,则需要在 IP 地址前加上 @

      
      rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory
      
    

如果要复制多个文件或目录,需要列出文件或目录的路径。其语法如下:

      
        rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory
      
    

远程传输特定协议

Rsync 允许您指定特定的文件传输协议。 为此,您需要使用 -e 选项,后跟协议名称。

例如,如果要使用 ssh 协议,必须将 -e ssh 附加到 rsync 命令:

      
      rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
      
    

将文件或目录从远程复制到本地

从远程复制到本地的 rsync 语法如下:

    
     rsync [选项] [email protected]:源地址 目标地址
    
  

这相当于一个拉取请求。因此,要将远程服务器中的文件/目录拉取到本地计算机,您需要运行以下命令:

    
      rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
    
  

该命令会将远程计算机目标目录中的文件拉取到本地计算机的源目录中。

同样,您可以通过提供完整路径来提取特定文件:

      
        rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory
      
    

要将多个文件或目录从远程复制到本地,您需要在服务器 IP 地址后的花括号内指定路径(以逗号分隔):

      
        rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
      
    

同样,您也可以指定文件。

在传输过程中显示实时进度

查看大数据备份的实时进度是个好主意。为此,您需要使用 --progress 标志。将其添加到 rsync 命令后,您可以看到传输速度、剩余时间和传输的数据量。

      
      rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
      
    

传输完成后删除源文件

您可以使用 --remove-source-files 标志在传输完成后删除源文件。 这在许多情况下都非常有用,尤其是在不留下任何痕迹的情况下保护文件,或者仅使用它们来释放空间时。

        
          rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
        
      

Rsync 空运行

Rysnc 还允许您在实际运行之前进行评估。模拟运行使您能够查看自己操作是否正确。毕竟,您不希望错误地更新甚至删除文件。

您需要使用 --dry-run 选项来进行模拟运行。将其添加到命令中,后跟源和目标:

      
        sudo rsync -v --dry-run source-directory/file1 dest-directory
      
    
      
        nitt rsync-tutorial
        $ sudo rsync -v --dry-run source-directory/file1 dest-directory
        file1

        sent 43 bytes  received 19 bytes  124.00 bytes/sec
        total size is 474  speedup is 7.65 (DRY RUN)
        nitt rsync-tutorial
      
    

输出类似于我们之前运行命令的方式。 但是,您会注意到输出末尾提到了 (DRY RUN)

设置最小和最大文件大小

Rysnc 还允许您在传输过程中设置最小或最大文件大小。

因此,如果您要传输最小大小为 15KB 的文件,您需要使用 --min-size=15k

    
      rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
    
  

此命令只会复制最小文件大小为 15KB 的文件。 如果文件大小低于 15KB,则会被忽略。

同样,您可以使用 --max-size 标志来设置最大文件大小:

    
    rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
    
  

在这里,rsync 将忽略大小超过 450KB 的文件。

设置带宽限制

如果您正在执行其他带宽密集型任务,您可以设置 rysnc 来限制传输的带宽。 为此,请使用 --bwlimit=KB/s

    
      rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
    
  

在这里,我们将在传输过程中将带宽设置为 100Kb/s。

总结

至此,我们已经结束了 rsync 命令指南。 我们学习了如何使用 rysnc 并有效地涵盖了大量命令。

然而,rysnc 提供的功能远不止我们所介绍的这些。因此,您可能还需要查看 rsync 的手册页,其中涵盖了 rsync 的各个方面。

接下来,您可以查看适用于 Windows、Linux 和 macOS 的命令行备忘单。