使用 rsync 时,有时 rsync 不会复制完成的所有文件,下面是我使用的代码。它们是一种在 rsync 之后进行校验和检查的方法,以查看是否所有文件都已复制,如果在复制所有文件之前不重试?
TEMP="/home/user/temp"
OPTS="-rav -h"
rsync $OPTS --stats user@example.com:/home/user/Local $TEMP
正如 uʍop ǝpısdn 的回答所暗示的那样,rsync -c
或者rsync --checksum
可以做你需要的。
-c, --checksum: 根据校验和跳过,而不是 mod-time & size
这会强制发送方使用 128 位 MD4 校验和对每个常规文件进行校验和。它在初始文件系统扫描期间执行此操作,因为它构建所有可用文件的列表。然后接收方检查每个文件的版本(如果存在并且与发送方对应的文件大小相同),以决定需要更新哪些文件:选择大小改变或校验和改变的文件转移。由于除了在文件传输期间发生的自动校验和验证之外,还会对连接两侧的所有文件进行整个文件校验和,因此此选项可能会非常慢。
请注意,rsync 总是通过检查其整个文件校验和来验证每个传输的文件是否在接收端正确重建,但是自动传输后验证与此选项的传输前“此文件是否需要要被更新?” 查看。
如今,对速度缓慢的担忧可能与此无关,当您不能或不想依赖修改时间时,这似乎是一个不错的选择。
我认为这最好通过rsync
正确配置来解决。阅读man
页面 :) 有选项(比如--checksum
这个)。
您也可以自己执行此操作:
find
rsync'd 目录中的所有文件。xargs md5sum
获取所有文件的校验和md5sum
校验和如果您在双方(本地/远程)都这样做,您将有一个校验和进行比较。
采用rsync -Pahn --checksum /path/to/source /path/to/destination | sed '/\/$/d' | tee migration.txt
sed
从校验和验证中删除目录。
tee
同时输出到屏幕和文件。
请记住,如果您有非常大的文件,这可能不是一个合适的方法,因为验证需要很长时间。