使用rsync,我如何知道源文件的哪些属性与导致传输的目标文件不同

使用rsync,我如何知道源文件的哪些属性与导致传输的目标文件不同

我严重依赖rsync远程数据传输和备份目的,有时也依赖不同的文件系统类型。 AFAIKrsync默认情况下会比较文件大小和修改时间戳以找出需要传输的文件。可以使用标志将此行为更改为仅文件大小--size-only,并且可以使用标志将其替换为文件校验和--checksum

有时,当我知道目的地具有与源相同的数据时,我不太清楚为什么rsync决定应该重新传输一棵大文件树。

是否有 rsync 选项或类似的选项可以帮助轻松找出两个文件树之间的差异,例如对于每个文件,它可以打印时间戳、所有者/组、权限、文件大小/内容等之一。

答案1

首先,如果rsync中有这样的选项,我不知道它并且在手册页中找不到它。这是不幸的,因为它会快速提供您所需的内容,并且可能适用于任何可能的rsync用例。

其次,我认为,如果尝试使用现有的 rsync 选项(基本上是 --dry-run 结合大量可能的校验和、日期较新、日期较旧、文件应该组合)来做到这一点,被删除,无限循环)将需要多次传递rsync,针对文件可能被rsync删除的每种可能原因传递一次。对于您的目的来说,这似乎不太实用。

如果您可以使用一个工具来比较两棵树并报告差异并插入其输出以满足您的需求,那么mtree可能会满足您的需求。

mtree专门设计用于比较两个目录树并报告差异。

在源计算机上,创建所需源树的 mtree 规范(包括 sha256 哈希):

# mtree -K sha256 -cp /my_path > my_path.mtree

然后将rsync树跨越,并在远程机器上运行 mtree 查看远程目录树 /remote_path 是否与本地 /my_path 匹配:

# rsync -a --delete /my_path/ remote:/remote_path/
# ssh remote mtree -p /remote_path < my_path.mtree && echo match
match

现在让我们稍微修改一下远程树。长话短说,我创建了一个farkle源上不存在的目标文件,删除了一个文件file.txt,并更改了文件上的时间戳data.txt

# ssh remote mtree -p remote_path < my_path.mtree || echo fail
.:      modification time (Wed Apr 17 10:49:32 2019, Wed Apr 17 11:55:10 2019)
extra: farkle
data.txt: 
        modification time (Wed Apr 17 10:45:02 2019, Wed Apr 17 11:56:27 2019)
foo:    size (32, 29)
        modification time (Tue Apr 16 10:16:44 2019, Wed Apr 17 11:53:18 2019)
        sha256digest (0x6082aa7261362c4c71c82adf492bc724de53a5814e64b233c43c6775efeb1dd0, 0x2d2537ea27c27dfb2c1690c51c652b9ada32adc29a91b732c24939dcff371cd6)
./file.txt missing
fail

mtree通知您:

  • farkle存在于目的地,但不存在于源;如果您在rsync命令行中指定 --delete ,它将被删除。
  • data.txt内容(sha256 哈希)或大小没有改变,但有更新的时间戳;仅基于校验和进行复制可能不会重新传输文件,也不会rsync仅传输“较新”的文件,因为目标文件现在比源文件新。
  • file.txt目标主机上不存在,并且可能会rsync在下次运行时被删除,除非存在某些排除标准。

所以这并不能给你一个直接的理由来自 rsync关于为什么它是或不是复制你认为应该复制的内容,但它为您提供有关本地和远程目录树的实际情况的可靠、可验证的报告。

如果您my_path.mtree有条不紊地保留输出文件,例如通过在文件名中包含日期戳,您还可以mtree在本地计算机上运行,​​将现有的 /my_path 树与之前的运行(昨天的?上周的?)进行比较,以查看是否有更改在本地,您可能没有想到。

mtree包含在一些 Unix 发行版中,但如果你的发行版缺少 mtree,我已经成功安装Archie Cobbs 的版本来自 GitHub

相关内容