使用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。