![同步大型、很少更改的文件](https://linux22.com/image/1468321/%E5%90%8C%E6%AD%A5%E5%A4%A7%E5%9E%8B%E3%80%81%E5%BE%88%E5%B0%91%E6%9B%B4%E6%94%B9%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个家庭服务器,其中包含大量(合法获得的)媒体文件。当我不在时,有人向这个集合中添加内容时,我希望能够将这些文件同步到我的笔记本电脑上的远程副本。
我知道这个问题的一般解决方法是rsync
,但是它太慢了。我知道它会检查源和目标上的每个文件以查找更改,并且在开始任何传输之前,此枚举会花费大量时间。
通常,只添加了一两个文件,并且没有更改任何现有文件。是否有一个可以按需运行的实用程序(而不是像 Syncthing 或 BitTorrent Sync 这样的持续运行的服务),能够避免枚举或保留每个位置的文件列表缓存?
(在理想情况下,还会有一种方法,可以不重新同步接收端已删除的文件,而无需从发送服务器中删除它们。)
答案1
根据 rsync 手册页,这可能有帮助。但也可能没有。
--size-only skip files that match in size
此外,手册页还描述了 rsync 如何决定文件是否需要同步。默认情况下,它不使用校验和。
-c, --checksum
This changes the way rsync checks if the files have been changed and are in need of a transfer. Without this option, rsync uses a "quick check" that (by default) checks if each
file’s size and time of last modification match between the sender and receiver. This option changes this to compare a 128-bit checksum for each file that has a matching size. Gen‐
erating the checksums means that both sides will expend a lot of disk I/O reading all the data in the files in the transfer (and this is prior to any reading that will be done to
transfer changed files), so this can slow things down significantly.
听起来 rsync 使用校验和来验证传输的数据,并且此行为无法禁用。不过,这个人有一个解决方法。
https://lists.samba.org/archive/rsync/2007-June/017853.html
不过,我从未发现 rsync 很慢。是否有其他原因?您是否在某些非常旧的 CPU 上执行此操作?
还有其他文件同步工具。Unison 怎么样?我还没试过。
如何编写自己的脚本来执行此操作?您可以通过 NFS 或 SMB 安装或使用 FTP 等...并使用您自己的简单代码同步数据。
答案2
rsync 需要很长时间的原因是它需要读取两端的所有数据才能创建比较图。一旦文件系统在特定时间戳同步,您只需要 rsync 自该时间戳以来已更改的文件(在 rsync 完成时触摸文件,然后使用 find....-newer...)。或者使用 AFS。
答案3
rsync
在检查数据之前检查时间戳和大小。这相对较快,但在传输开始之前会有延迟。这通常相当快。但是,Windows FAT 文件系统的时间戳分辨率为 2 秒。与分辨率为 1 秒的系统相比,这可能会导致时间戳检查失败。添加--modify-window=1
允许时间戳相差一秒并解决问题。
它对媒体文件可能有帮助,--whole-file
因为可能没有必要移动文件增量。但是,如果您更新了 ID3 标签,增量可能会更快。
unison
如果您在文件服务器和笔记本电脑上都进行了更改,那么基于 rsync 的解决方案可能会很好地发挥作用。