从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
实现更激进的版本:--existing
rsync
原来的:
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 版本的find
和rsync
。 (我优先选择用来find … -print0 | rsync --from0 …
处理意外的文件名。)
正如您所期望的,--dry-run
当您确定您有一个有效的命令时,将其删除。