Linux 中的 Rsync 命令及实例
本指南通过简单的示例向您展示如何在 Linux 中使用 rsync 命令来同步文件和目录。
Rsync 是每个 Linux 管理员必备技能的命令部分。它是一个命令行工具,用于镜像文件和目录、进行备份以及将数据迁移到其他服务器。
rsync 命令的使用在功能上与 SCP 命令类似,但提供了一些优点和更大的灵活性。
本指南将通过简单的示例向您展示如何使用 rsync 命令在 Linux 下高效地执行文件和目录同步。其中大多数需要使用两台 Linux 机器。
因此,rsync 必须可用。幸运的是,它已在大多数 Linux 发行版中预安装并可用。但如果您没有它,您可以使用发行版的包管理器轻松安装它,例如 APT、DNF、Pacman、XBPS 等,包名称为 rsync。
Rsync 命令如何工作
Rsync 进行单向同步,默认情况下,它使用 SSH 来确保传输安全。此外,rsync 进程通过与另一个 rsync 进程通信来进行操作。
因此,如果要在两个远程服务器之间同步文件或目录,必须首先在两台服务器上安装rsync
命令。
如前所述,Rsync 在幕后利用 SSH。因此,无论您使用哪种类型的 Linux 机器,强烈建议您提前在两台机器上创建 SSH 密钥。如果您不确定如何查看我们的优秀指南“如何生成 SSH 密钥对(带示例)”。
那么最好在主机之间交换这些 SSH 密钥以确保无密码操作。但是,您再次可以依靠我们的“如何设置无密码 SSH 登录”指南来寻求帮助。
当客户端请求与远程服务器同步时,rsync 确定需要传输哪些文件。这意味着 rsync 将仅传输同时已修改的文件(增量传输算法)。
rsync 为此目的使用的最基本方法是简单地递归扫描文件夹并评估修改日期和确切的文件大小。
现在您已经了解了 Rsync 的工作原理,接下来我们来探讨一下如何使用它。
Rsync 命令语法
然而,在我们讨论如何使用 rsync 之前,了解 rsync 命令的语法是明智之举。然后,我们可以在浏览示例时记住语法。
rsync [OPTIONS] SOURCE DESTINATION
最重要的是要记住,SOURCE
是复制文件或目录的位置,DESTINATION
是文件和目录传输到的位置。
这是一个快速备忘单,突出显示了 rsync 命令最重要的参数。
-a
、--archive
:存档模式允许递归文件复制,同时仍保留符号链接、文件权限、用户和组所有权以及时间戳。-h
、--人类可读
:输出中的数字以人类可读的格式显示。-n
、--dry-run
:执行不做任何更改的试运行。-r
、--recursive
:递归复制数据,但在传输数据时不保留时间戳和权限。-v
、--verbose
:增加详细程度。-z
、--compress
:用于在传输过程中通过压缩数据来节省空间。
如何在Linux中使用rsync命令
下面的大多数示例都使用涉及两台 Linux 计算机的场景,分别用符号标记为 east
和 west
。澄清完毕后,让我们开始讨论指南的重点。
本地复制/同步单个文件
以下命令会将单个文件 (logo.jpg
) 从一个目录 (/srv/dir1
) 同步到另一个目录 (/srv/dir2
) )在本地机器上。如果目标目录尚不存在,rsync 将自动创建它。
rsync /srv/dir1/logo.jpg /srv/dir2/
正如您所看到的,在本例中,rsync 的功能与众所周知的 cp 命令类似。
当目标位置省略文件名时,将复制具有当前名称的文件。但是,如果您想以不同的名称保存文件,请在目标部分输入新名称。
rsync /srv/dir1/logo.jpg /srv/dir2/new-logo.jpg
在本地递归复制/同步多个文件和目录
当我们同步整个目录时,rsync 命令的真正威力就会发挥作用。
但在我们讨论实际示例之前,让我们先澄清一些重要的事情。当您使用 rsync 命令将一个目录及其子目录同步到另一个目录时,您通常希望保留文件修改时间、文件权限、符号链接等。
为了实现这一目标,您需要结合多个选项。最终结果看起来像-rlptgoD
,很难记住。幸运的是,rsync
提供了上述选项的简化版本,合并为单个选项 -a
。
因此,通过在命令中添加 -a 参数,您将得到:
- (
-r
) 递归到目录 - (
-l
) 将符号链接复制为符号链接 - (
-p
) 保留权限 - (
-t
) 保留修改时间 - (
-o
) 保留所有者 - (
-g
) 保留组 - (
-D
) 保留设备文件
在一个易于记忆的文件中并使用 -a
(存档)参数。
经过这些说明,下面的命令会将所有文件从 /srv/dir1
目录传输到同一计算机上的 /srv/dir2
目录。
rsync -a /srv/dir1/ /srv/dir2/
但是,以这种方式运行时,rsync 命令不会返回有关其执行的活动的任何额外信息。因此,我们将在 -a 选项中添加三个参数来看看会发生什么:-v
、-z
和 -h
。
这给我们带来了经典且最广泛使用的带有 -avzh
参数的 rsync 命令。
-v
选项提供有关传输的额外信息,-z
在传输过程中压缩文件以节省空间,-h
显示大小以易于理解的格式传输的文件。
我们可以再次运行该命令,输出的信息明显更多。
rsync -avzh /srv/dir1/ /srv/dir2/
从本地计算机递归复制/同步多个文件和目录到远程计算机
尽管 rsync 非常适合在系统上本地同步文件,但它最常用于在两台远程 Linux 计算机之间同步文件。
要将 /srv/dir1
目录的全部内容从本地计算机 (east
) 传输到远程计算机 (/tmp/dir1
) 上代码>西),输入:
rsync -avzh /srv/dir1/ root@west:/tmp/dir1/
现在让我们关注语法。正如您所看到的,第一部分(源代码)是本地目录的路径 (/srv/dir1
)。另一方面,第二部分使用 SSH 中熟悉的 user@host
语法指定远程主机。
后面是作为分隔符的冒号 (:
),后面是文件应存放到的远程系统上的目录 (/tmp/dir1
) 的完整路径被转移。
将多个文件和目录从远程递归复制/同步到本地计算机
将文件从远程计算机传输到本地计算机与前面的示例相同。唯一的区别是源位置和目标位置已交换。
换句话说,我们将使用远程计算机作为源,使用本地计算机作为目标。
因此,要将名为 west
的系统上的远程目录 /tmp/dir1
的全部内容传输到本地系统上的 /srv/dir1
机器,运行:
rsync -avzh root@west:/tmp/dir1/ /srv/dir1/
从同步中排除文件和目录
rsync 命令的一项有用功能是能够指定哪些文件或目录应从同步操作中排除。
这可以通过两种方式完成:直接从命令行列出它们 (--exclude
) 或通过在单独的文本文件中指定这些文件和目录 (--exclude-from
)代码>)。让我们演示这两种方法。
例如,我们将服务器 west
上的远程目录 /tmp/dir1
与本地目录 /srv/dir1
同步。但是,我们将指定从同步过程中排除 myfiles
目录和 test.txt
文件。
有了这些说明,我们的命令将如下:
rsync -avzh --exclude=myfiles --exclude=test.txt root@west:/tmp/dir1/ /srv/dir1/
请注意,我们提供的是所需文件和目录的相对路径 (test.txt
),而不是完整路径 (/srv/dir1/test.txt
)排除。
现在考虑第二种方法。为此,请创建一个文本文件,其中包含我们要排除的文件和目录的列表,然后将该文件作为参数传递给 rsync 命令。
为此,我们创建一个名为 exclude.txt
的测试文件,如下所示:
然后我们执行:
rsync -avzh --exclude-from=exclude.txt root@west:/tmp/dir1/ /srv/dir1/
当然,您可以将 --exclude
选项与通配符 (*
) 一起使用。例如,如果您想从同步中排除所有 JPG 文件,您可以使用 --exclude=*.jpg
。
包含要同步的文件
与 --exclude
选项类似,--include
允许我们指定要在同步中包含哪些文件。但是,此选项与 --exclude
结合使用时效果最佳。这使我们能够限制可以传输的文件类型。
例如,如果我们只想传输 JPG 文件而排除所有其他文件,则命令如下:
rsync -avzh --include='*.jpg' --exclude='*' root@west:/tmp/dir1/ /srv/dir1/
删除文件
同步文件时,删除源中不存在但目标中可用的文件是另一个有用的选项。我们可以使用 --delete
选项来实现此功能。
目前,我们的本地 /srv/dir1
目录如下所示:
我们假设远程服务器 (west
) 上我们要同步的目录中只有 index.php
和 logo.jpg
文件可用(/tmp/dir1
)。我们使用 --delete
选项运行 rsync
:
rsync -avzh --delete root@west:/tmp/dir1/ /srv/dir1/
如您所见,使用 --delete
选项运行 rsync
后,我们的计算机(目标)上存在但不在我们同步的源目录中的文件是自动删除。
但有一点我们必须强调。使用 --delete
选项运行 rsync
时请务必小心。如果您在指定来源时犯了错误,则目的地上的所有内容都将被删除。
因此,强烈建议在使用--delete
之前,使用--dry-run
选项测试rsync
命令的执行情况添加,我们将在下一节中描述。
使用 Rsync 执行试运行
使用此选项可以为您省去很多因错误而带来的麻烦。 --dry-run
选项指示 rsync 执行不进行任何更改的试运行,并产生与实际运行相同的结果。
参考上面的例子,我们可以运行带有 --dry-run
选项的 --delete
命令来测试结果是否符合预期。
rsync -avzh --delete --dry-run root@west:/tmp/dir1/ /srv/dir1/
虽然没有对文件进行任何更改,但我们可以看到同步期间将执行哪些操作。
传输后删除源文件
有时,您可能希望在传输后删除源文件。例如,您可以将每日备份传输到新服务器。因此,一旦传输完成,就不再需要旧服务器上的源文件。
您可以使用--remove-source-files
选项删除源文件。
rsync -avzh --remove-source-files root@west:/tmp/dir1/ /srv/dir1/
这里要记住的重要一点是,使用 --remove-source-files
选项执行 rsync 只会从源中删除文件,而不是目录。
避免 Rsync 覆盖修改的目标文件
如前所述,当使用 rsync 在两个目录之间同步文件时,如果文件在源和目标中均存在且相同,则不会传输这些文件。
但是,如果您同时对目标中的文件进行更改,则这些更改将在后续传输时替换为源中的原始文件。
在这种情况下,您可以添加 -u
(--update
) 选项来跳过覆盖更新的目标文件。
rsync -avzhu root@west:/tmp/dir1/ /srv/dir1/
显示传输过程中的进度
您可以使用 --progress
选项来显示传输数据的进度。因此,当特定文件的传输完成时,rsync
会显示一个摘要行,如下所示。
rsync -avzh --progress root@west:/tmp/dir1/ /srv/dir1/
设置传输的最大和最小文件大小
rsync 命令的另一个有用功能是能够指定最大值 (--max-size
) 或最小值 (--min-size
) ) 要同步的文件的大小。
运行以下命令以跳过任何小于 100KB 的文件:
rsync -avzh --min-size=100k root@west:/tmp/dir1/ /srv/dir1/
同样,要传输不大于1MB的文件,请使用以下命令:
rsync -avzh --max-size=1m root@west:/tmp/dir1/ /srv/dir1/
设置带宽限制
使用--bwlimit
选项设置机器之间数据传输期间的带宽限制。当您不想使网络吞吐量超载时,此选项非常有用。此外,rsync 命令使用千字节每秒 (KB/s) 作为其测量单位。
例如,要将最大传输速度设置为 500KB/s,请键入:
rsync -avzh --bwlimit=500 root@west:/tmp/dir1/ /srv/dir1/
结论
在本文中,我们介绍了在 Linux 下使用 rsync 命令同步文件的最常见方法。我们希望对您有所帮助。
有关 rsync 命令的更多信息可以在其手册页上找到。
请随时在下面的部分留下您的意见、建议和补充。