📜  Linux 中的 rsync 命令和示例

📅  最后修改于: 2022-05-13 01:57:32.247000             🧑  作者: Mango

Linux 中的 rsync 命令和示例

rsync或远程同步是类 Unix 系统的软件实用程序,可有效地在两台主机或机器之间同步文件和目录。其中一个是文件将同步的源或本地主机,另一个是同步将在其上进行的远程主机。 rsync可以通过两种方式复制/同步数据:

  • 通过任何远程 shell(如 sshrsh )向/从另一台主机复制/同步。
  • 使用 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
    

例子:

  • 使用 rsync 作为列表命令:如果只指定了源路径,则源的内容以类似于ls -l的输出格式列出。
    rsync foo/ 

    上面的命令将列出目录foo 中存在的文件和目录。

    输出:

    rsync 表现为列表命令

  • 在本地复制/同步文件和目录:如果源路径或目标路径均未指定远程主机,则 rsync 命令的行为与复制命令相同。
    rsync -avh foo/ bar/ 

    foo存在的所有文件和目录复制/同步到目录bar 。如果目标目录不存在(此处为bar ),rsync 会自动创建一个并复制其中的所有数据。

    输出:

    rsync 在本地复制

  • rsync 使用 ssh:rsync有两种不同的方式来联系远程系统:
    • 使用远程外壳程序作为传输(例如ssh (安全外壳)或rsh (远程外壳))。
    • 通过 TCP 直接联系 rsync 守护进程。

    在这里,我们将讨论 ssh 上的 rsync。

    rsync -avhze ssh /foo user@remote-host:/tmp/
    

    要指定要使用的协议类型,请使用-e选项。



    输出:

    rsync 同步

  • 具有特定文件权限的 Rsync:如果我们想将文件同步到具有更改文件权限的本地或远程主机。必须使用以下命令。
    rsync -avhe ssh --chown=USER:GROUP /foo user@remote-host:/tmp/
    

    上面的命令会将目录/foo 中存在的remote-host中目录 /tmp中存在的文件同步,其中包含 GROUP 组 USER 拥有的所有文件。

    输出:

    同步时间

    注意: usergroup必须已经在远程主机中创建。

  • Rsync with --ignore-existing-files:我们也可以跳过目标上已经存在的文件。这通常可以在我们使用–link-dest选项执行备份时使用,同时继续进行中断的备份运行。
    rsync --ignore-existing -avhe /foo user@remote-host:/tmp/
    

    因此,目标上不存在的任何文件都将被复制。在这里,我从目录foo geeksforgeeks文件夹,因此它应该只复制geeksforgeeks目录。

    注意:这不会忽略现有目录,否则什么也做不了。即使本地主机中的文件有一些更改,如果它存在于远程主机上,它仍然不会被同步。

    输出:

    rsync 忽略现有

  • 在传输过程中显示进度:要显示将数据从本地主机传输到远程主机时的进度,我们可以使用-–progress选项。
    rsync -avhe ssh --progress /foo user@remote-host:/tmp/
    

    当特定文件的传输完成时,rsync 输出如下所示的摘要行。

    输出:

    同步进度



    在上图中,如果我们查看文件/foo/file2 ,它告诉我们

    • 该文件总共有 44 个字节长。
    • 在完成整个文件的 0:00:00 秒内,整个文件的平均传输速率为每秒 42.97 KB。
    • 这是当前 rsync会话期间的第二次传输。
    • 在文件列表中的 13 个文件中,还有 10 个文件需要远程主机检查(以查看它们是否是最新的)。
  • 仅当本地文件系统上有更新版本时才更新远程:如果我们想通过远程主机复制本地文件系统上最近更新的文件。它是通过–update标志完成的。现在的行为是这样的:
    • 复制远程主机上不存在的文件。
    • 本地和远程都存在但在本地主机上具有更新时间戳的文件将被复制到远程主机。 (相反,不会复制具有较旧时间戳的文件)。

    在这里,我对file1file2进行了一些更改,但file2中的更改是最近完成的。只有这样, file2才会同步。

    rsync -avhe ssh --progress --update /foo root@remote-host:/tmp/
    

    输出:

    同步更新

  • 成功传输后自动从本地主机删除文件:现在,假设我们有一个 Web 服务器和一个备份服务器,我们创建了一个每日备份并将其与我们的备份服务器同步,然后我们不想保留该文件的本地副本在我们的网络服务器中备份。 --remove-source-files标志自动从 Web 服务器中删除文件,而不是在成功传输后手动删除它。
    rsync -avhe ssh --remove-source-files /foo user@backup-server:/tmp
    

    输出:

    rsync 删除源文件

    注意:这将只删除文件而不是目录。

  • 删除本地主机上已删除的文件:如果本地主机上有一些文件被删除,并且我们希望在远程主机上也更新这些文件,那么我们需要使用--delete选项.
    rsync -avhe ssh  /foo --delete user@remote-host:/tmp/
    

    输出:

    同步删除

    因此,这里file1file2file3在本地主机上被删除,并且可以看出,也在远程主机中更新。

    注意: rsync 不会自动删除文件以同步双方存在的目录。

  • 使用 rsync执行试运行:试运行使 rsync 执行不做任何更改的试运行,并显示与实际运行几乎相同的输出。它通常与 -v、-verbose 和/或 -i、-itemize-changes 选项一起使用,以便在实际运行 rsync 命令之前查看它会做什么。
    rsync -avhe ssh --dry-run --chown=USER:GROUP /foo user@remote-host:/
    

    输出:

    rsync 试运行