RSYNC 不会比较文件内容

作者: , 共 1131 字 , 共阅读 0

在同步一个超大文件时,发现 rsync 并没有按照预期的同步一个文件。而使用md5sum检验文件内容时,原始文件和目标文件的内容并不一样。

1、rsync的默认算法

man rsync的文档里可以看到:

Rsync finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file』s data does not need to be updated.

即默认rsync只会比较文件大小和最后修改时间,只要这两者一样,rsync即认为文件相同。其它属性(包括文件内容)的不同,并不会让rsync同步该文件!

2、用参数控制rsync的比较算法

通过设置合适的参数,可以控制 rsync 的比较算法。事实上, rsync 有三步来比较文件:

  1. 比较文件大小。
  2. 比较文件最后修改日期。
  3. 比较文件内容,通过checksum(比如md5sum)。

我们可以用参数来控制 rsync 执行上面的哪些步骤:

  • 默认的算法只执行 1 和 2。
  • 参数--size-only只检查 1 ,亦即只要文件一样大,即使修改日期不一样,就认为文件一样,更不会去检查文件内容。
  • 参数--ignore-times是忽略所有检查,直接认为文件都不一样,然后总是复制文件。
  • 参数--checksum是在 1 的基础上执行 3 ,比较文件内容。如果文件大小不一样,可以确保内容不一样。如果文件大小一样,那么直接比较文件内容,不会执行 2 中的比较修改日期。该方法最安全,但需要读取两边的文件内容,某些情况下要慢很多(尤其是最后比较出来的文件内容一样的情况)。

详细的算法可参考 TR-CS-96-05 The rsync algorithm

该使用什么参数:

  • 大部分情况下用默认参数即可。
  • 如果会出现文件大小和修改时间一样,但内容不一样的情况,此时需要用--checksum
  • 确定文件内容大概率不一样需要同步,可以直接使用--ignore-times,这比--checksum省去了检查文件内容的时间。

Q. E. D.

类似文章:
编程 » Linux, rsync
在一个rsync命令同步文件夹时:
IT » cronjob
第一步,在当前服务器导出计划任务:
IT » Linux, grep
最简单的方式是使用grep-L参数,查找当前目录下不包含指定字符串的文件:
IT » Linux, cheatsheets
cheat 提供命令行的速记记录,在命令行下,随时增加笔记随时查看,用的时间越长越强大!
IT » gnu, Linux
简单列一些 Linux 自带的 GNU 命令的常用用法,可以当做 cheatsheet 使用。
IT » Ubuntu
之前一直没有意识到,等到发生了才后悔莫及。Ubuntu 账号密码过期后果很严重:
获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。
IT » Linux
假设一个目录下有很多很多".bak"文件,如果我们直接用rm命令删除:
本文结论:不要过度担心 Matlab 的传值调用的效率问题。
编程 » C++, boost, 命令行
我们用boost的命令行库program_options解析命令行,在解释布尔命令行时使用下面代码:
IT » WSL, SSH
世界上最好的 Linux 发行版 Bash on Windows 已经升级到了 Ubuntu 18.04 ,并且提供越来越多的功能。下面是笔记,记录如何启动子系统的 SSHD 服务并设置开机自动启动,也顺带开机自动启动了子系统。
这是一个老问题,最近有老同学问起,就在这里提一下吧。