Linux 中的 rsync 命令和示例
rsync或远程同步是类 Unix 系统的软件实用程序,可有效地在两台主机或机器之间同步文件和目录。其中一个是文件将同步的源或本地主机,另一个是同步将在其上进行的远程主机。 rsync可以通过两种方式复制/同步数据:
- 通过任何远程 shell(如 ssh 、 rsh )向/从另一台主机复制/同步。
- 使用 TCP 通过 rsync 守护程序复制/同步。
Rsync 以其增量传输算法而闻名,它仅复制本地主机中存在的源文件与目标或远程主机中的现有文件之间的差异。
例子:
rsync local-file user@remote-host:remote-file
这里发生了什么: Rsync 将首先使用 SSH 以user
身份连接到远程主机并询问user's
密码。连接后,它将调用远程主机的 rsync,然后两个程序将确定需要复制本地文件的哪些部分,以便远程文件与本地文件匹配。请注意 rsync 的以下行为:
- 复制远程主机上不存在的文件。
- 已更新的文件将被同步,rsync 将仅将文件的更改部分复制到远程主机。
- 完全相同的文件根本不会复制到远程主机。
rsync 的语法:
rsync [options] source [destination]
选项:
- -a, –archive:这相当于使用-rlptgoD 。存档模式包括所有必要的选项,如递归复制文件、保留几乎所有内容(如符号链接、文件权限、用户和组所有权以及时间戳)。
-a, --archive
注意:归档模式不保留硬链接,因为查找多重链接的文件很昂贵。必须为硬链接明确指定-H 选项。
- -v, –verbose:默认情况下, rsync静默工作。单个-v将为我们提供有关正在传输的文件的信息以及有关最后传输的数据的简要摘要。两个-v选项将为我们提供有关增量传输状态的信息以及哪些文件是最新的以便跳过,并在最后提供更多信息。两个以上的 -v 选项通常用于调试 rsync。
-v, --verbose
- -h, –human-readable format:以人类可读的格式输出。
-h, --human-readable format
- -z, –compress:在传输过程中压缩文件数据
-z, --compress
例子:
ls -l
的输出格式列出。 rsync foo/
上面的命令将列出目录foo 中存在的文件和目录。
输出:
rsync -avh foo/ bar/
foo
存在的所有文件和目录复制/同步到目录bar 。如果目标目录不存在(此处为bar
),rsync 会自动创建一个并复制其中的所有数据。
输出:
- 使用远程外壳程序作为传输(例如
ssh
(安全外壳)或rsh
(远程外壳))。 - 通过 TCP 直接联系 rsync 守护进程。
在这里,我们将讨论 ssh 上的 rsync。
rsync -avhze ssh /foo user@remote-host:/tmp/
要指定要使用的协议类型,请使用-e
选项。
输出:
rsync -avhe ssh --chown=USER:GROUP /foo user@remote-host:/tmp/
上面的命令会将目录/foo 中存在的remote-host
中目录 /tmp中存在的文件同步,其中包含 GROUP 组 USER 拥有的所有文件。
输出:
注意: user
和group
必须已经在远程主机中创建。
--ignore-existing-files:
我们也可以跳过目标上已经存在的文件。这通常可以在我们使用–link-dest选项执行备份时使用,同时继续进行中断的备份运行。 rsync --ignore-existing -avhe /foo user@remote-host:/tmp/
因此,目标上不存在的任何文件都将被复制。在这里,我从目录foo
geeksforgeeks
文件夹,因此它应该只复制geeksforgeeks
目录。
注意:这不会忽略现有目录,否则什么也做不了。即使本地主机中的文件有一些更改,如果它存在于远程主机上,它仍然不会被同步。
输出:
-–progress
选项。 rsync -avhe ssh --progress /foo user@remote-host:/tmp/
当特定文件的传输完成时,rsync 输出如下所示的摘要行。
输出:
在上图中,如果我们查看文件/foo/file2
,它告诉我们
- 该文件总共有 44 个字节长。
- 在完成整个文件的 0:00:00 秒内,整个文件的平均传输速率为每秒 42.97 KB。
- 这是当前 rsync会话期间的第二次传输。
- 在文件列表中的 13 个文件中,还有 10 个文件需要远程主机检查(以查看它们是否是最新的)。
- 复制远程主机上不存在的文件。
- 本地和远程都存在但在本地主机上具有更新时间戳的文件将被复制到远程主机。 (相反,不会复制具有较旧时间戳的文件)。
在这里,我对file1和file2进行了一些更改,但file2中的更改是最近完成的。只有这样, file2才会同步。
rsync -avhe ssh --progress --update /foo root@remote-host:/tmp/
输出:
--remove-source-files
标志自动从 Web 服务器中删除文件,而不是在成功传输后手动删除它。 rsync -avhe ssh --remove-source-files /foo user@backup-server:/tmp
输出:
注意:这将只删除文件而不是目录。
--delete
选项. rsync -avhe ssh /foo --delete user@remote-host:/tmp/
输出:
因此,这里file1 、 file2 、 file3在本地主机上被删除,并且可以看出,也在远程主机中更新。
注意: rsync 不会自动删除文件以同步双方存在的目录。
rsync -avhe ssh --dry-run --chown=USER:GROUP /foo user@remote-host:/
输出: