rsync的基础

rsync  是一种非常通用的复制和备份工具,默认情况下,几乎每个Linux发行版都包含 rsync。它可以用作高级复制工具,使我们能够在本地和远程复制文件。它也可以用作备份工具。它支持创建增量备份。

rsync  具有著名的增量传输算法,该算法允许我们传输新文件以及对现有文件的最新更改,而忽略未更改的文件。另外此, rsync   的行为可以高度定制,帮助我们自动化备份,也可以作为后台进程运行使电脑变成一台主机允许rsync客户端连接到它。

除了本地文件和文件夹的复制,  rsync的  让我们SSH(安全壳),RSH(远程Shell)拷贝过来,它可以运行在一台计算机的后台驻留程序,并允许其他计算机连接到它,当  rsync的  运行作为守护程序,它侦听端口TCP 873。

当我们将  rsync  用作守护程序或使用RSH时,在计算机之间发送的数据将不加密传输,因此,如果要在同一本地网络中的两台计算机之间传输文件,这很有用,但是不应使用通过不安全的网络(例如Internet)传输文件。为此,SSH是必经之路。

这是为什么我赞成在传输中使用SSH的主要原因,此外,由于SSH是安全的,因此许多服务器都有可用的SSH守护程序。但是,将  rsync  用作守护程序以通过快速连接进行传输(在本地网络中通常如此)非常有用。我的计算机中没有运行RSH守护程序,因此您可能会在示例中发现我对SSH有点偏见。涉及两台计算机之间文件传输的示例使用SSH作为传输介质,但在另一篇文章中,我介绍了将rsync用作守护程序。

复制本地文件

要将一个本地文件夹的文件(不含子文件夹)复制到另一个本地文件夹,以替换目标文件夹中的文件,我们使用:

rsync source_folder/* destination_folder/

此命令将source_folder文件夹的文件(不含子文件夹)复制到destination_folder文件夹,当source_folder文件夹的文件有变化时此命令会将source_folder文件夹变化后的文件覆盖destination_folder文件夹中的同名文件,source_folder文件夹中有已复制到destination_folder文件夹中的文件被删除时,此命令不删除destination_folder文件夹中的同名文件,可以看作一个有效的source_folder文件夹的半备份命令(备份的含义是源文件删除,备份目录并不会同时删除,但此命令会同步文件内容变化)。

复制本地文件和文件夹

要将一个本地文件夹的内容复制到另一个本地文件夹,以替换目标文件夹中的文件,我们使用:

rsync -rtv source_folder/ destination_folder/

在source_folder中 注意,我在末尾添加了一个斜杠,这样做会阻止创建新文件夹,如果不添加斜杠,则会在目标文件夹中创建一个名为source文件夹的新文件夹。因此,如果您要将名为Pictures的文件夹的内容复制到一个已存在的文件夹(也称为Pictures,但位于其他位置),则需要添加斜杠,否则,将在Pictures文件夹内创建一个名为Pictures的文件夹,我们指定为目的地。

rsync -rtv source/ destination/

参数  -r  表示递归,即它将复制源文件夹的内容以及其中的每个文件夹的内容。

参数  -t  使rsync 保留从源文件夹复制的文件的修改时间。

参数  -v  表示冗长,此参数将打印有关命令执行的信息,例如已成功传输的文件,因此我们可以使用它作为跟踪rsync进度的方式。

这是我经常使用的参数,因为我通常会备份个人文件,并且其中不包含诸如symlinks之类的东西,但是与rsync一起使用的另一个非常有用的参数是-a参数。

rsync -av source/ destination/

参数  -a  还会使副本递归并保留修改时间,但除此之外,它还会将遇到的符号链接复制为符号链接,保留权限,保留所有者和组信息以及保留设备和特殊文件。如果您要复制用户的整个主文件夹,或者要在其他位置复制系统文件夹,则此功能很有用。

处理空格和稀有字符

我们可以像在bash中一样,通过在任何空格和稀有字符之前使用\来转义空格和稀有字符。此外,我们可以使用单引号将字符串括起来:

rsync -rtv so\{ur\ ce/ dest\ ina\{tion/
rsync -rtv 'so{ur ce/' 'dest ina{tion/'

更新文件夹的内容

为了节省带宽和时间,我们可以避免复制目标文件夹中已有的文件,而源文件夹中尚未修改的文件。为此,我们可以将参数-u 添加   到  rsync,这将使目标文件夹与源文件夹同步,这是输入增量传输算法的位置。要像这样同步两个文件夹,我们使用:

rsync -rtvu source_folder/ destination_folder/

默认情况下,  rsync  将考虑文件的修改日期和文件的大小,以确定是否需要传输文件或文件的一部分,或者是否可以单独保留文件,但是我们可以改用散列决定文件是否不同。为此,我们需要使用  -c  参数,该参数将在要传输的文件中执行校验和。这将跳过校验和重合的所有文件。

rsync -rtvuc source_folder/ destination_folder/

使用rsync同步两个文件夹

为了使两个文件夹保持同步,不仅需要像过去的主题一样将源文件夹中的新文件添加到目标文件夹中,还需要从目标文件夹中删除在源文件夹中删除的文件。 。 rsync  允许我们使用参数--delete 来执行此操作,该参数  与前面说明的参数-u 结合使用,该参数   更新已修改的文件,从而使我们可以在保持带宽的同时保持两个目录同步。

rsync -rtvu --delete source_folder/ destination_folder/

通过添加一些其他参数,可以在传输的不同时刻进行删除过程:

  • rsync可以查找丢失的文件并将其删除,然后再执行传输过程,这是默认行为,可以使用--delete-before 进行设置 
  • 传输完成后,rsync可以使用--delete-after 参数查找丢失的文件 
  • rsync可以删除在传输过程中完成的文件,当发现文件丢失时,该文件即被删除,我们通过--delete-during 启用此行为 
  • rsync可以在此过程中进行传输并找到丢失的文件,但不是在此过程中删除文件,而是等到完成并删除其后找到的文件,可以使用--delete-delay 完成 

例如:

rsync -rtvu --delete-delay source_folder/ destination_folder/

传输文件时压缩文件

为了节省带宽,通常也可以节省一些时间,我们可以压缩正在传输的信息,为此,我们需要 在rsync上添加参数  -z 。

rsync -rtvz source_folder/ destination_folder/

但是请注意,如果我们通过快速连接传输大量小文件, 则使用-z参数时rsync可能比不使用rsync时要慢,因为在传输每个文件之前压缩每个文件要比通过文件。如果你有使用此参数一个 一个 的两台计算机之间具有有限的连接速度,或者如果你需要节省带宽。

在两个远程系统之间传输文件

在运行SSH守护程序,RSH守护程序或 rsync守护程序的系统中, rsync可以复制文件并将本地文件夹与远程文件夹同步。此处的示例使用SSH进行文件传输,但是如果您想将 rsync  作为主机中的守护程序来执行此操作,则可以应用相同的原理 , 有关以下更多信息,请参见下文中的 ssh无法使用时,将  rsync作为守护程序运行

要在本地计算机和远程计算机之间传输文件,我们需要指定远程系统的地址,它可以是域名,IP地址或我们已经保存在SSH 配置中的服务器的名称。文件(有关如何执行此操作的信息,请参见“  定义SSH服务器”),其后是冒号以及我们要用于传输的文件夹。请注意,rsync 无法 在两个远程系统之间传输文件,只能将本地文件夹或远程文件夹与本地文件夹一起使用。为此,我们使用:

本地文件夹到远程文件夹,使用SSH配置文件中定义的域,IP地址和服务器:
rsync - rtvz source_folder / user @ domain:/ path / to / destination_folder /
rsync - rtvz source_folder / user@xxx.xxx。 xxx.xxx:/ path / to / destination_folder /
rsync - rtvz source_folder / server_name:/ path / to / destination_folder /

远程文件夹到本地文件夹,使用SSH配置文件中定义的域,IP地址和服务器:
rsync - rtvz user @ domain:/ path / to / source_folder / destination_folder /
rsync - rtvz user@xxx.xxx.xxx。 xxx:/ path / to / source_folder / destination_folder /
rsync - rtvz 服务器名称:/ path / to / source_folder / destination_folder /

排除文件和目录

在很多情况下,我们需要从rsync中排除某些文件和目录,常见的情况是当我们将本地项目与远程存储库甚至与实时站点同步时,在这种情况下,我们可能要排除一些开发目录,一些隐藏文件被转移到实时站点。可以使用  --exclude  后跟目录或我们要排除的文件来排除文件。如上一节所述,源文件夹或目标文件夹可以是本地文件夹或远程文件夹。

rsync的 - RTV --exclude '目录' SOURCE_FOLDER / destination_folder /
rsync的 - RTV --exclude 'file.txt的' SOURCE_FOLDER / destination_folder /
rsync的 - RTV --exclude '路径/到/目录' SOURCE_FOLDER / destination_folder /
rsync的 - RTV -排除'路径/要/ file.txt的' SOURCE_FOLDER / destination_folder /

路径相对于我们称为rsync的文件夹,除非它以斜杠开头,否则路径将是绝对的。

执行此操作的另一种方法是创建一个文件,其中包含要从rsync中排除的文件和目录的列表以及模式(将排除所有与模式匹配的文件,*。txt将排除具有该扩展名的任何文件) ,每行一个,然后使用--exclude-from 调用此文件,   然后使用我们要用于排除文件的文件。首先,我们在最喜欢的文本编辑器中创建和编辑此文件,在本示例中,我使用gedit,但您可以使用kate,Vim,nano或任何其他文本编辑器:

触摸 excluded.txt
的gedit excluded.txt

在此文件中,我们可以添加以下内容:

目录
relative / path / to / directory
file.txt
relative / path / to / file.txt
/ home / juan / directory
/ home / juan /file.txt
*。p

然后我们调用rsync:

rsync的 - RVZ --exclude-从'excluded.txt' SOURCE_FOLDER / destination_folder /

除了删除已从源文件夹中删除的文件(如  使用rsync同步两个文件夹中所述)外,  rsync  可以删除传输中排除的文件,我们使用--delete-excluded 参数执行此操作  ,例如:

rsync - rtv --exclude-from'excluded.txt'-删除源/目标/

此命令将使  rsync的  递归,从源文件夹,增加冗长保留修改时间,排除所有的文件模式匹配的文件  excluded.txt ,并删除所有符合这一文件的patternif它们在目标文件夹中。

ssh不可用时,将rsync作为守护程序运行

这已移至其自己的部分,即  作为守护程序运行rsync

一些其他的rsync 参数

-t  保留正在传输的文件的修改时间。
- q  禁止任何非错误消息,这是违背-v这增加了详细程度。
-d  传输目录而无需递归,即仅传输文件夹中的文件。
-l  复制符号链接 作为符号链接。
-L 每当找到符号链接时, 复制符号链接指向的文件。
-W  复制整个文件。当我们使用增量传输算法时,我们仅复制存档中已更新的部分,有时这是不希望的。
- 进展 显示正在传输的文件的进度。
-h 以人类可读的格式 显示rsync提供给我们的信息,其数量以K,M,G等表示。

脚注

rsync  为我们提供的选项很多  ,我们可以准确地定义我们要传输的文件,要压缩的特定文件,如果要删除的文件在目标文件夹中要删除的文件,并且可以处理系统文件也是如此,有关更多信息,我们可以使用  man rsync  和  man rsyncd.conf

我将有关备份的信息留在了本文之外,因为它将在传入的文章中讨论备份以及自动化。

可以 使用cygwin在Windows上  运行rsync,但是目前我没有Windows框(我也不打算 在可预见的将来购买一个Windows框),所以即使以为我已经做到了,我也可以对此没有发表。如果 在Windows tho中将rsync作为服务运行  ,则需要 在modules区域下的rsyncd.conf中添加“ strict mode = false ”  行,这将防止  rsync  检查secrets文件中的权限,因此失败,因为它们是设置不正确(因为它们与Linux中的工作方式不同)。

如果有需要更正的内容,可以对本帖子进行更新;如果我认为有必要,可以添加更多信息。