当文件不同时使用 rsync 复制

Pau*_*aul 0 rsync

我必须使用 rsync 将一个大目录复制到我的 NAS,我想说 rsync 仅在源和目标不同时复制文件,以避免复制已复制的文件。

Mec*_*cki 5

跳过相同的文件是人们使用 rsync 的全部目的。这是 rsync 的默认行为。大多数情况下,您要使用的唯一选项是-a

rsync -a -P <source> <dest>
Run Code Online (Sandbox Code Playgroud)

-P刚刚手段显示进度和-a手段“归档”,这意味着“复制文件时,尽量使副本尽可能相同”(尽量保持权限,所有权,时间戳等),但也意味着,如果“只更新文件你必须”。这就像说“确保<dest>是”的最新备份<source>

但是,默认情况下rsync,如果两个文件具有相同的文件大小和相同的最后修改日期,则它们已经将它们视为相同的文件。当然,两个文件也可以具有相同的大小和相同的最后修改日期而不是相同的。因此,当第一次运行该命令时,您不确定哪些文件可能需要更新,哪些不需要,请尝试以下操作:

rsync -a -c -P <source> <dest>
Run Code Online (Sandbox Code Playgroud)

-c意味着不要仅仅依赖大小和日期,对每个文件进行校验和比较校验和。仅当校验相同时,才将文件视为相同。请注意,rsync 不需要对整个文件进行校验和,大文件被分成较小的块,并且每个块都单独进行校验和,因为只传输已更改的块。

因此,即使使用校验和,您也可以在通过网络连接进行复制时为您节省大量时间。在本地复制时,它不会为您节省任何时间,因为仅复制所有内容可能比校验所有内容更快。因此,当源和目标都是本地驱动器时,普通副本的速度总是会超过校验和 rsync。在这种情况下使用

cp -a -v <source> <dest>
Run Code Online (Sandbox Code Playgroud)

或者如果您的系统不知道-a,请使用

cp -pPR -v <source> <dest>
Run Code Online (Sandbox Code Playgroud)

这与-a. 同样,这-v只是为了看到一些进展。

而且我只-c用于第一次同步,之后,依靠文件大小和上次修改日期通常可以很好地进行更新,而且速度要快得多。它将起作用,因为如果自上次同步以来文件已被更改,它将具有不同的最后修改日期,因此仅通过比较日期 rysnc 就会知道该文件必须在目的地进行更新。当然,只有当您的系统都设置了正确的日期/时间并且您不操纵文件的最后修改日期并且也不禁止您的系统更新它们时,这才有效。

如果您只想跳过文件,请使用以下命令:

rsync -a -P --ignore-existing <source> <dest>
Run Code Online (Sandbox Code Playgroud)

这就像告诉 rsync “如果你在目的地看到一个同名的文件,总是认为它是相同的,永远不要更新它”。

请注意,如果-a检测到的文件 in<source>与 中的文件不同<dist>,无论这是由大小和修改日期决定还是由校验和决定,它将始终更新文件 at<dest>以匹配然后文件 at <source>。如果多个源同步到同一个目的地,您可能还想添加-u这意味着“如果两个文件不同,只有在文件的<source>最后修改日期比文件的最后修改日期更新时才更新<dest>


就像一般提示一样,如果您键入

man <command>
Run Code Online (Sandbox Code Playgroud)

在终端中,您将在大多数系统(Linux、MacOS X 和 UNIX 系统)上获得一个很好的帮助页面,向您详细解释所有选项。您可以使用箭头键向上/向下滚动或向上/向下翻页,您可以通过点击“q”退出该视图。例如

man rsync
Run Code Online (Sandbox Code Playgroud)