使用rsync命令同步文件和目录的用法 [11个示例]

rsync是一个免费的命令行工具,可让您在本地和远程同步文件。使用它,您可以传输文件和目录。

这使得它非常适用于数据迁移,执行备份和镜像,非常适合网站管理员和管理员进行重复的数据传输任务。

本文将教我们如何使用Rysnc并给出一些有用的示例。

rsync是如何工作的?

rsync是一种用于Unix-like系统的远程同步命令行实用程序。它使用户能够在两台机器或两个主机之间无缝地传输/同步文件。

在幕后,rsync使用增量传输算法。此算法涉及复制两个主机(源和目标)之间的差异文件。源和目标可以是本地或远程的。rsync命令可以以两种方式执行复制/同步数据任务。这些方式包括:

  • 使用ssh、rsh在两个主机之间进行复制/同步。
  • 使用TCP rsync守护程序进行复制/同步。

由于它设计用于Unix-like系统中,因此也适用于Linux

rsync使用的逐步过程如下:

  • rsync使用SSH连接到远程主机并请求密码。
  • 连接后,远程主机的rsync与源进行通信。
  • 然后,这些程序将确定需要同步的文件和目录。它使用增量传输算法来检查文件之间的差异。

如果rsync命令在主机上找不到文件,但在远程主机上有,它将复制并传输到主机系统。同样,对于已存在的文件(无论是在主机上还是在远程主机上),它将复制它们之间的差异(即更改的部分)。最后,它将忽略两个系统上没有修改的现有文件。

rsync命令通过将差异存储在临时文件中然后将其推送到目标来实现增量更新。

开始之前:

  • 您需要具有root或sudo权限
  • 可以访问终端/命令行界面
  • 安全运行rsync命令的SSH访问
  • 您还需要两台计算机来进行rsync。

对于本教程,我们将使用Linux Mint 21.1 Vera。使用任何其他Linux发行版都可以轻松地按照指南进行操作。

为什么要使用rsync而不是scp?

Scp(安全复制)是一种流行的命令行协议,可让用户复制文件。它采用线性方法进行复制。这意味着它只是将文件从源复制到目标。为了进行安全复制,它使用SSH

scp命令的语法如下:

scp选项 源 目标

然而,问题仍然存在,为什么要使用rsync而不是scp?

嗯,使用rsync有多个好处。这些好处包括:

  • 更快的执行:rsync比scp快,因为它使用远程更新协议。这使它只传输差异而不传输整个文件。因此,如果您建立了一个定期的同步任务,您只需要在第一次进行完整复制。从下一次开始,它只会通过增量传输算法复制已更新的部分。
  • 更少的带宽消耗:由于rsync不必再次复制整个文件,这导致了更少的带宽消耗。此外,它还使用压缩/解压缩算法在传输过程中最小化文件大小。
  • 更多的命令行选项:rsync在命令行选项的数量上也胜过scp。这意味着您可以比scp更精细地调整rsync。

总之,rsync是一个优秀的增量同步工具。scp工具对于安全传输/同步文件也非常有帮助。在现实世界的情况下,如果您想要更简单的方法,scp适用于日常任务。然而,对于重复任务,请使用rsync。

rsync命令语法

rsync命令如下:

  • 本地到本地:rsync选项 源目录 目标目录
  • 本地到远程:rsync选项 源目录 用户@主机:目标目录
  • 远程到本地:rsync选项 用户@主机:源目录 目标目录

这里,术语定义如下:

  • 选项 – 这些是rsync选项
  • 源目录 – 源目录
  • 目标目录 – 目标目录
  • 用户 – 远程用户名
  • 主机 – 远程主机名或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的使用。

为了本教程,我们将创建两个目录。

  • source-directory
  • dest-directory

为此,您需要键入以下命令。

mkdir source-directory
mkdir dest-directory

此外,我们需要生成文件以使rsync工作。因此,让我们使用以下命令创建一些测试文件。

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

这将在源目录中创建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

注意:我们将dest-directory保持为空。

本地递归复制目录

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

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

rsync选项 源 目标

通过运行以下命令将我们的source-directory中的文件复制到dest-directory中。

rsync -r source-directory/ dest-directory

这里,命令“递归”将文件从source-directory复制到dest-directory

这将每个文件从源目录复制到目标目录。

复制单个文件到本地

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

为此,我们将编辑源目录中的空文件 file1,然后将其与 dest 目录中存在的相同文件进行同步。

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

nano source-directory/file1

现在将以下文本复制粘贴到 nano 编辑器中。

我们正在更新源目录中的文件1。
一旦我们更新,我们将将新更新推送到 dest 目录中。
rsync 不需要使用增量传输算法对文件进行重新复制。
此算法检查差异,然后相应地更新目标文件。
因此,一旦您保存源目录中的文件1,请打开目标目录中的文件1。它将为空。
但是,如果我们在运行 rsync 后检查它,您将看到目标目录中的文件1已更新。

现在,关闭并保存文件。

现在,我们使用 rsync 来复制文件。

sudo rsync -v –existing source-directory/file1 /dest-directory

# 输出
nitt rsync-tutorial
$ sudo rsync -v –existing source-directory/file1 dest-directory
file1

已发送 557 字节 接收到 35 字节 1,184.00 字节/秒
总大小为 474 速度为 0.80

nitt rsync-tutorial

正如您可能已经注意到的,我们使用了 –existing 选项。这将更新现有文件。如果您运行不带 –existing 的命令,它不会进行更新,即使运行成功。

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

rsync -v 源目录/新文件 目标目录
#输出
nitt rsync教程
$ rsync -v 源目录/新文件 目标目录
新文件

已发送 82 字节, 已接收 35 字节, 234.00 字节/秒
总大小是 0 速率是 0.00

复制多个文件

如果您想要复制多个文件,您必须提及两个文件的源路径,然后是目标目录。

为此,我们将在源目录中创建两个新文件:新文件2新文件3。运行以下命令进行操作。

touch 源目录/新文件{2..3}

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

rsync -v 源目录/新文件2 源目录/新文件3 目标目录
#输出
nitt rsync教程
$ rsync -v 源目录/新文件2 源目录/新文件3 目标目录
新文件2
新文件3

已发送 135 字节, 已接收 54 字节, 378.00 字节/秒
总大小是 0 速率是 0.00
nitt rsync教程
$ 

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

本地到远程传输的rsync语法如下。

rsync 选项 源 用户@主机:目标

如您所见,您需要知道远程机器的IP地址才能使其正常工作。此外,您需要在源文件后添加IP地址。

rsync -av /Projects/rsync-tutorial/源目录 192.168.192.200:/Projects/rsync-tutorial/目标目录

在开始传输之前,它会要求您输入密码。输入密码继续。此外,如果远程机器上的用户不同,则需要在IP地址之前提及它,后面跟着@

rsync -av /Projects/rsync-tutorial/源目录 [email protected]:/Projects/rsync-tutorial/目标目录

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

rsync -av /Projects/rsync-tutorial/源目录/新文件1 /Projects/rsync-tutorial/源目录/新文件2 192.168.192.200:/Projects/rsync-tutorial/目标目录

远程传输特定协议

rsync允许您指定特定的文件传输协议。要这样做,您需要使用-e选项,后跟协议。

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

rsync -e ssh /Projects/rsync-tutorial/源目录 192.168.192.200:/Projects/rsync-tutorial/目标目录

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

本地到远程传输的rsync语法如下。

同步选项 用户@主机:源 目标

这充当拉取请求。因此,要将所需的文件/目录从远程服务器获取到本地计算机,您需要运行以下命令。

rsync -av 192.168.192.200:/Projects/rsync-tutorial/目标目录 /Projects/rsync-tutorial/源目录

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

类似地,您可以通过提及其完整路径来拉取特定文件。

rsync -av 192.168.192.200:/Projects/rsync-tutorial/目标目录/新文件4 /Projects/rsync-tutorial/源目录

要将多个文件或目录从本地复制到远程服务器,您需要在服务器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模拟运行

Rsync还允许您在实际运行之前进行评估。模拟运行可以让您看到您是否正在做正确的事情。毕竟,您不希望通过错误更新文件甚至删除它们。

您需要使用–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)

设置最小和最大文件大小

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

因此,如果您希望进行最小15KB大小的传输,您需要使用–min-size=15K

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

该命令仅复制文件大小至少为15KB的文件。如果文件大小低于此值,它将忽略该文件。

类似地,您可以使用–max-size标志设置最大文件大小。

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

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

设置带宽限制

如果您正在进行其他带宽密集型任务,您可以设置rsync在传输过程中设置带宽限制。为此,请使用–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命令指南的结束。我们学习了如何使用rsync并有效地覆盖了大量的命令。

然而,rsync提供的功能远不止我们所涵盖的内容。因此,您可能还希望阅读这篇文章,其中涵盖了rsync的方方面面。

接下来,请查看这篇文章,了解Windows,Linux和macOS。

类似文章