来自man rsync
:
所以,我所做的一切显然是成功的:
rsync --existing -rtvhP "remote.machine:/photos/*" /photos
这应该会重置我的本地机器上的任何更改的照片,以匹配remote.machine上的原件(使用-rt
将通过文件夹递归地操作并重置时间戳,但不必费心地拥有或剪切或复制链接--这就是-a所做的),但不需要传输任何其他文件--而不是没有改变的文件,当然也不是所有其他经过几十年拍摄的文件夹和文件!
为了确定可能发生的任何更改,这些更改更改了数据,但没有修改文件大小/修改时间标记( rsync默认用于确定是否需要传输文件/文件夹),我认为应该添加-c
(校验和)。
rsync --existing -crtvhP "remote.machine:/photos/*" /photos
我注意到的是,即使文件/文件夹甚至不在本地/photos上,rsync在返回“我什么都没做”之前花费了大量的时间。我认为这是rsync中的一个错误,它没有使用从--existing
返回的结果(即“该文件不存在,因此什么也不做”),然后再继续执行如果该文件确实存在就会执行的工作--在这种情况下,将检查数千个永远不需要传输的文件。
FYI,我使用photos/*
而不是photos/
,因为我只希望传输可见的文件,而不是任何隐藏的dot.文件夹/dot.file。
我不知道这是否重要,但我正在本地的Mac上运行zsh中的rsync,与不同的基于unix的服务器对话;但我验证了这种条件在同质的ubuntu系统之间也存在。
如果这确实是rsync中的一个bug。有人能告诉我哪里是最好的报告吗?
谢谢你的指点,建议,答案。
发布于 2023-02-06 15:29:30
在本例中,我使用的是: rsync版本2.6.9协议版本29
谢谢@Freddy的建议。看起来-c
标志优先于--existing
,所以rsync做了很多不必要的(IMHO)工作。下面是我的测试用例,它是一个新创建的空目录,它不需要复制任何东西,而且,我想,它不需要对一些它不需要的东西进行校验求和,但是看起来rsync有其他的首选项(即,校验和所有的内容,然后决定是否需要使用它。)¯_(ツ)_/ my。
我创建了一个新的、空的文件夹"test",并使用shell内置的time
来跟踪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会工作的方式,但是知道它是如何工作的是很好的。:-)
发布于 2023-02-06 18:09:39
继你自己的答案确认--checksum
优先于--existing
之后,您可以通过向rsync
提供要考虑的文件列表来实现更激进的--existing
版本:
原件:
rsync
修改后的备选案文:
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
。
https://unix.stackexchange.com/questions/733827
复制相似问题