当文件不同时使用 rsync 复制

copy with rsync when files are different

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

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

rsync -a -P <source> <dest>

-P 仅表示显示进度,-a 表示 "archive",这表示 "when copying files, try to make copy as identical as possible"(尝试保留权限、所有权、时间戳等)但是也意味着 "Only update files if you have to"。就像说 "make sure <dest> is an up-to-date backup of <source>".

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

rsync -a -c -P <source> <dest>

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

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

cp -a -v <source> <dest>

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

cp -pPR -v <source> <dest>

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

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

如果你只想跳过存在的文件,使用这个:

rsync -a -P --ignore-existing <source> <dest>

这就像告诉 rsync "If you see a file with the same name at the destination, always consider it to be identical and never update it"。

请注意,如果 -a 检测到 <source> 中的文件与 <dist> 中的文件不同,无论是由大小和修改日期还是校验和确定的,它都会始终更新 <dest> 处的文件以匹配 <source> 处的文件。如果多个源同步到同一目的地,您可能还想添加 -u,这意味着 "in case two files are different, only update if the file at <source> has a newer last modification date than then file at <dest>"


作为一般提示,如果您输入

man <command>

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

man rsync