首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >rsync是否计算校验和,即使它不会传输任何数据?

rsync是否计算校验和,即使它不会传输任何数据?
EN

Unix & Linux用户
提问于 2023-01-31 16:07:21
回答 2查看 105关注 0票数 2

来自man rsync

所以,我所做的一切显然是成功的:

代码语言:javascript
运行
复制
rsync --existing -rtvhP "remote.machine:/photos/*" /photos

这应该会重置我的本地机器上的任何更改的照片,以匹配remote.machine上的原件(使用-rt将通过文件夹递归地操作并重置时间戳,但不必费心地拥有或剪切或复制链接--这就是-a所做的),但不需要传输任何其他文件--而不是没有改变的文件,当然也不是所有其他经过几十年拍摄的文件夹和文件!

为了确定可能发生的任何更改,这些更改更改了数据,但没有修改文件大小/修改时间标记( rsync默认用于确定是否需要传输文件/文件夹),我认为应该添加-c (校验和)。

代码语言:javascript
运行
复制
rsync --existing -crtvhP "remote.machine:/photos/*" /photos

我注意到的是,即使文件/文件夹甚至不在本地/photos上,rsync在返回“我什么都没做”之前花费了大量的时间。我认为这是rsync中的一个错误,它没有使用从--existing返回的结果(即“该文件不存在,因此什么也不做”),然后再继续执行如果该文件确实存在就会执行的工作--在这种情况下,将检查数千个永远不需要传输的文件。

FYI,我使用photos/*而不是photos/,因为我只希望传输可见的文件,而不是任何隐藏的dot.文件夹/dot.file。

我不知道这是否重要,但我正在本地的Mac上运行zsh中的rsync,与不同的基于unix的服务器对话;但我验证了这种条件在同质的ubuntu系统之间也存在。

如果这确实是rsync中的一个bug。有人能告诉我哪里是最好的报告吗?

谢谢你的指点,建议,答案。

EN

回答 2

Unix & Linux用户

发布于 2023-02-06 15:29:30

在本例中,我使用的是: rsync版本2.6.9协议版本29

谢谢@Freddy的建议。看起来-c标志优先于--existing,所以rsync做了很多不必要的(IMHO)工作。下面是我的测试用例,它是一个新创建的空目录,它不需要复制任何东西,而且,我想,它不需要对一些它不需要的东西进行校验求和,但是看起来rsync有其他的首选项(即,校验和所有的内容,然后决定是否需要使用它。)¯_(ツ)_/ my。

我创建了一个新的、空的文件夹"test",并使用shell内置的time来跟踪rsync在每个测试用例上的工作时间--在新文件夹中同步13104张照片。

代码语言:javascript
运行
复制
% 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
EN

Unix & Linux用户

发布于 2023-02-06 18:09:39

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

原件:

rsync

修改后的备选案文:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/733827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档