qrsync 是根据什么来判断文件是否有修改的?

有一批需要同步的文件 每次重新生成后即使文件内容没变、文件名没变也会被同步,难道 qrsync 判断是否有变化跟文件创建时间还有关系?

阅读 6k
1 个回答

qrsync是在rsync基础上进行的封装,所以算法也是基于rsync

对于rsync,同步过程如下

  • 建立网络链路并校验权限
  • 发送方传输本地文件列表,包括目录结构文件名、每个文件的修改时间大小

    • 如果指定-c, --checksum参数,则会包含每个文件的checksum(一种hash)
    • 如果指定-p, --perms参数,则会包含每个文件的owner,group以及权限
  • 接收方一一对比,如过存在某项属性有和本地文件有差异的,则放入传输列表
  • 针对需要传输的文件列表,采用rsync算法计算出文件中差异的部分,进行尽可能最小化的传输

因此默认情况下,判断一个文件是否需要传输,是基于修改时间文件大小,如果二者都一样,则会直接跳过这个文件。这样的算法,虽然简单粗暴,但是对I/O及CPU的消耗微乎其微,也基本上能适应大部分场景。这样的算法会忽略那些通过非正常手段修改了文件内容,但是时间戳和文件大小都没有变化的文件,因此rsync提供-c参数进行更严格的对比。

针对题主的情况,可以加上--size-only参数,这样的话,针对同一个文件(路径),如果文件大小保持一致,只是修改时间不同,也会直接跳过,不进行传输。