使用 Rsync 和 Unison 同步保持远程目录的最新更新状态

如果你正在阅读这篇文章,很可能已经使用 SSH 连接到远程服务器,并使用 SCP(安全复制协议)在计算机之间复制文件。如果你只需要复制一个文件(或一个目录),而且以后不会修改,那么这种方法就非常有效。但是,如果你正在开发一个应用程序或机器学习程序,并希望在远程服务器上运行,你会发现自己需要不断复制文件和目录。最简单的方法是复制项目的根目录,但这意味着目录中的每个文件每次都会被复制,即使你只修改了其中一个文件中的一行。如果文件很大,这个过程的效率就会很低。这就是为什么你应该使用 Rsync 或 Unison 的原因。

Rsync

Rsync 就是远程同步,是一种通过网络同步文件的 Unix 工具。它内置在许多 Linux 系统中,也被移植到 Windows 系统中。它使用 SSH 按需传输文件。Rsync 会检查源目录并与远程目录进行比较。当发现源文件的修改时间与远程文件的修改时间不一致时,它就会启动文件复制。已经更新的文件不会被复制到远程机器上。

Rsync 的使用非常简单。要同步一个目录,运行

rsync -a mydir/ user@remote:mydir

这将把本地 mydir 的内容复制到远程 mydir。执行此操作需要 SSH 访问远程服务器。选项 -a 表示复制是递归的,并保留符号链接。我还建议在源目录后加斜线。如果源目录后面没有斜线,那么源目录本身就会复制到目标目录中。有了斜线,源目录的内容就会被复制。也可以在源目录后加上 ./。在这种情况下,当前目录的内容将被复制到远程的 mydir 目录中。远程目的地的指定方式与 SCP 相同:user@server:/absolute_pathuser@server:relative_path_from_user_home

您也可以反过来从远程同步目录到本地,但不能同时同步两种方式:

rsync -a user@remote:mydir/ mydir

默认情况下,Rsync 不会删除文件。要启用删除功能,请使用 –delete 标志。所有存在于目标目录但不存在于源目录的文件都将从目标目录中删除。使用此标记时要谨慎,如果没有必要,请不要使用。

Unison

Unison 用于以两种方式同时同步文件。你可以把 Rsync 视为单向同步,而把 Unison 视为双向同步。Unison 并不预装,但几乎 Linux、macOS 和 Windows 上的所有软件包管理器都有提供。列表在这里。在 Ubuntu 上,你可以用以下方法安装:

sudo apt install unison

别忘了在本地和远程计算机上安装。使用 SSH 协议同步两个目录的基本命令是

unison source/ ssh://user@remote/destination

源目录后面的斜杠不是必须的。要指定远程目的地的绝对路径,请在远程主机名后加两个斜杠: ssh://user@remote//home/user/destination

好吧,我们来试试。

创建包含文件 afilebfile 的本地 mydir。

plavy@local:~$ ls mydir
afile  bfile

接下来,确保您有 SSH 访问远程服务器的权限,并且远程服务器上安装了 Unison。现在,我们可以在本地运行 Unison。

plavy@local:~$ unison mydir ssh://plavy@remote/mydir

第一次运行时,您会收到这样的提示:

Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
 /home/plavy/mydir
 //remote//home/plavy/mydir
This can happen either
because this is the first time you have synchronized these roots, 
or because you have upgraded Unison to a new version with a different
archive format.

出现这种情况是因为 Unison 没有找到同步这两个目录的状态文件。

Unison 使用状态文件来跟踪哪台计算机对文件做了哪些修改。这有点类似于 Git 和其他版本控制系统的工作方式。想象一下,两个人提交到同一个分支。Git 需要跟踪修改,确保两人不会对某个文件做出冲突的修改。是的,Unison 在同步文件时也会遇到冲突。

你可以按回车键取消之前的提示。现在,Unison 会向你显示将进行哪些更改。在我们的例子中,一个目录将从本地计算机复制到远程计算机。您需要键入 y 来确认更新。

local          remote       
dir      ---->              [f] 

Proceed with propagating updates? [] y
Propagating updates

现在通过 SSH 连接到远程服务器,并查看主目录中的 mydir。

plavy@local:~$ ssh remote
plavy@remote:~$ ls mydir
afile  bfile

让我们在远程和本地计算机上都创建一个新文件,然后同步它。

plavy@remote:~$ touch mydir/cfile
---
plavy@local:~$ touch mydir/dfile 
plavy@local:~$ unison mydir ssh://remote/mydir

确保始终在同一台计算机上运行 Unison,即在本地计算机上运行。

local          remote       
         <---- new file   cfile  [f] 
new file ---->            dfile  [f] 

Proceed with propagating updates? [] y
Propagating updates

Unison 检测到新文件,并将同时同步它们。现在,本地和远程目录中都有这四个文件。这很容易,但如果我们产生了冲突怎么办?让我们在同一个文件中添加不同的文本,然后尝试同步。

plavy@remote:~$ echo "important" > mydir/cfile
---
plavy@local:~$ echo "more important" > mydir/cfile 
plavy@local:~$ unison mydir ssh://remote/mydir

我们需要解决冲突。键入 < >,以指示覆盖文件的方向。

local          remote       
changed  <-?-> changed    cfile  [] >

我键入了 > ,这意味着本地文件将优先。最后,你可以检查文件,确保两台电脑上的内容相同。

plavy@remote:~$ cat mydir/cfile
more important
---
plavy@local:~$ cat mydir/cfile 
more important

结论

总之,Rsync 和 Unison 都是同步不同电脑上目录的不错选择。如果只需单向复制文件,请使用 Rsync。如果需要双向复制文件,则使用 Unison。例如,如果要在远程服务器上训练人工智能模型,Unison 就很有用。首先,在本地编写代码,然后用 Unison 将目录复制到远程服务器上,运行训练,再用相同的 Unison 命令将模型数据复制回自己的电脑。无需使用 SCP 进行手动复制。此外,Unison 还会随时通知你它将要应用的更改,这是一个很好的安全机制。

本文文字及图片出自 Keep Your Remote Directory Up To Date With Rsync And Unison

阅读余下内容
 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号