2023年12月1日发(作者:)
使⽤rsync同步⽂件夹
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⼀起使⽤的另⼀个⾮常有⽤
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 作为主机中的守护程序来执⾏此操作,则可以应⽤相同的原理 , 有关以下更多信息,下⽂
中的,将 。
要在本地计算机和远程计算机之间传输⽂件,我们需要指定远程系统的地址,它可以是域名,IP地址或我们已经保存在SSH 配置中的服务
器的名称。⽂件(有关如何执⾏此操作的信息,请参见“ ),其后是冒号以及我们要⽤于传输的⽂件夹。请注意,rsync ⽆法 在两个远程
系统之间传输⽂件,只能将本地⽂件夹或远程⽂件夹与本地⽂件夹⼀起使⽤。为此,我们使⽤:
本地⽂件夹到远程⽂件夹,使⽤SSH配置⽂件中定义的域,IP地址和服务器:
rsync - rtvz source_folder / user @ domain:/ path / to / destination_folder /
rsync - rtvz source_folder / user@。 :/ 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:/ 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 '的' SOURCE_FOLDER / destination_folder /
rsync的 - RTV --exclude '路径/到/⽬录' SOURCE_FOLDER / destination_folder /
rsync的 - RTV -排除'路径/要/ 的' SOURCE_FOLDER / destination_folder /
路径相对于我们称为rsync的⽂件夹,除⾮它以斜杠开头,否则路径将是绝对的。
执⾏此操作的另⼀种⽅法是创建⼀个⽂件,其中包含要从rsync中排除的⽂件和⽬录的列表以及模式(将排除所有与模式匹配的⽂
件,*。txt将排除具有该扩展名的任何⽂件) ,每⾏⼀个,然后使⽤--exclude-from 调⽤此⽂件, 然后使⽤我们要⽤于排除⽂件的⽂
件。⾸先,我们在最喜欢的⽂本编辑器中创建和编辑此⽂件,在本⽰例中,我使⽤gedit,但您可以使⽤kate,Vim,nano或任何其他⽂本
编辑器:
触摸
的gedit
在此⽂件中,我们可以添加以下内容:
⽬录
relative / path / to / directory
relative / path / to /
/ home / juan / directory
/ home / juan /
*。p
然后我们调⽤rsync:
rsync的 - RVZ --exclude-从'' SOURCE_FOLDER / destination_folder /
除了删除已从源⽂件夹中删除的⽂件(如 , rsync 可以删除传输中排除的⽂件,我们使⽤--delete-excluded 参数执⾏此操作 ,例如:
rsync - rtv --exclude-from''-删除源/⽬标/
此命令将使 rsync的 递归,从源⽂件夹,增加冗长保留修改时间,排除所有的⽂件模式匹配的⽂件 ,并删除所有符合这⼀
⽂件的patternif它们在⽬标⽂件夹中。
当ssh不可⽤时,将rsync作为守护程序运⾏
这已移⾄其⾃⼰的部分,即 。
⼀些其他的rsync 参数
-t 保留正在传输的⽂件的修改时间。
- q 禁⽌任何⾮错误消息,这是违背-v这增加了详细程度。
-d 传输⽬录⽽⽆需递归,即仅传输⽂件夹中的⽂件。
-l 复制符号链接 作为符号链接。
-L 每当找到符号链接时, 复制符号链接指向的⽂件。
-W 复制整个⽂件。当我们使⽤增量传输算法时,我们仅复制存档中已更新的部分,有时这是不希望的。
脚注
rsync 为我们提供的选项很多 ,我们可以准确地定义我们要传输的⽂件,要压缩的特定⽂件,如果要删除的⽂件在⽬标⽂件夹中要删除的
⽂件,并且可以处理系统⽂件也是如此,有关更多信息,我们可以使⽤ man rsync 和 man
我将有关备份的信息留在了本⽂之外,因为它将在传⼊的⽂章中讨论备份以及⾃动化。
可以 使⽤在Windows上 运⾏rsync,但是⽬前我没有Windows框(我也不打算 在可预见的将来购买⼀个Windows框),所以即使以为
我已经做到了,我也可以对此没有发表。如果 在Windows tho中将rsync作为服务运⾏ ,则需要 在modules区域下的中添
加“ strict mode = false ” ⾏,这将防⽌ rsync 检查secrets⽂件中的权限,因此失败,因为它们是设置不正确(因为它们与Linux中
的⼯作⽅式不同)。
如果有需要更正的内容,可以对本帖⼦进⾏更新;如果我认为有必要,可以添加更多信息。


发布评论