即使 rsync 不传输任何数据,它也会计算校验和吗?

即使 rsync 不传输任何数据,它也会计算校验和吗?

man rsync

- 现存的

跳过创建新文件在接收器上(强调我的)

所以,我已经取得了明显的成功:

rsync --existing -rtvhP "remote.machine:/photos/*" /photos

这应该重置本地计算机上所有已更改的照片,以匹配远程计算机上的原始照片(使用-rt将通过文件夹递归操作并重置时间戳,但不必费心 chowning 或 chmodding 或复制链接 - 这就是 -a 所做的)但不要传输任何其他文件 - 不是未更改的文件,绝对不是数十年拍摄的所有其他文件夹和文件!

只是为了确定我可能所做的任何潜在更改,这些更改更改了数据,但没有修改文件大小/修改时间戳(rsync 默认使用它来确定是否需要传输文件/文件夹),我想我会添加-c(校验和)。

rsync --existing -crtvhP "remote.machine:/photos/*" /photos

我注意到的是,即使文件/文件夹甚至不存在于我的本地/照片中,rsync 在返回“我没有做任何事情”之前也会花费大量时间。我认为这是 rsync 中的一个错误--existing,在继续执行如果文件确实存在时它将执行的工作之前,它没有使用从(即“文件不存在,因此因此不执行任何操作”)返回的结果- 在此在这种情况下,会对数千个永远不需要传输的文件进行校验和。

仅供参考,我使用photos/*而不是photos/因为我只想传输可见文件,而不是任何隐藏的 dot.folders/dot.files。

我不知道这是否重要,但我在本地 Mac 上的 zsh 中运行 rsync,与另一个基于 UNIX 的服务器通信;但我验证了同质 ubuntu 系统之间也存在这种情况。

如果这确实是 rsync 中的一个错误。谁能告诉我去哪里举报最好?

感谢您的任何指示、建议、答案。

答案1

对于此示例,我使用: rsync 版本 2.6.9 协议版本 29

感谢@Freddy 的建议。看起来该-c标志优先于--existing,因此 rsync 做了很多不必要的(恕我直言)工作。这是我的测试用例,对于新创建的空目录,不需要复制任何内容,并且我本以为,不必费心对一堆不需要的东西进行校验和,但看起来 rsync 有其他首选项(即校验和)一切,然后决定是否需要使用。) ́\(ツ)/ ́

我创建了一个新的空文件夹“test”,并使用内置的 shelltime来跟踪 rsync 在新文件夹中同步 13104 张照片与零照片的每个测试用例上工作了多长时间。

% mkdir test
% time rsync -rtvhP --existing photos/* test
building file list ...
13104 files to consider
sent 710.56K bytes  received 20 bytes  1.42Mbytes/sec
total size is 912.33G  speedup is 1283921.48
rsync -rtvhP --existing photos/* test  0.03s user 0.09s system 37% cpu 0.327 total

% time rsync -rtvhPc --existing photos/* test
building file list ...
13104 files to consider
sent 919.66K bytes  received 20 bytes  134.90 bytes/sec
total size is 912.33G  speedup is 992002.92
rsync -rtvhPc --existing photos/* test      1201.16s user 210.36s system 20% cpu 1:53:37.01 total

因此,在没有校验和的情况下花费了 0.327 秒,但对不需要复制的文件进行校验和则花费了近两个小时。这不是我希望 rsync 工作的方式,但很高兴知道它就是这样工作的。 :-)

答案2

继从你自己的答案确认--checksum优先于,您可以通过提供要考虑的文件列表来--existing实现更激进的版本:--existingrsync

原来的:

rsync --existing -crtvhP "remote.machine:/photos/*" /photos

修改后的变体:

cd /photos &&
find . -type f -print | rsync --dry-run --files-from=- -crtvh --progress 'remote.machine:/photos/' .

你使用的是 Mac,所以我使用了非 GNU 版本的findrsync。 (我优先选择用来find … -print0 | rsync --from0 …处理意外的文件名。)

正如您所期望的,--dry-run当您确定您有一个有效的命令时,将其删除。

相关内容