如何使 rsync dst 时间戳反映上次从 src 传输内容的时间?

如何使 rsync dst 时间戳反映上次从 src 传输内容的时间?

我正在通过网络将文件从 src 同步到 dst。我正在 Linux 手册页上浏览许多 rsync 选项,并且需要一些帮助。

目标上的进程响应来自源的“新到达”文件。例如,假设源文件的修改时间是两天前,但rsync直到五分钟前才传输。我可以根据最近的时间戳来检测新到达的文件。

因此,我需要这种所需的时间戳行为:

  • dst 文件修改时间戳应表示最后一次通过 rsync 传输添加内容的时间。
  • 当 rsync 比较 src 和 dst 而不传输新内容时,即当 dst 已经与 src 匹配时,dst 文件修改时间戳不应更改。

哪些 rsync 选项提供了这种所需的行为?

答案1

你无法有效地做到这一点。rsync使用时间戳作为缩短网络中长传输的主要手段。

如果你真的想要这种时间戳行为,

  1. rsync目标文件时间戳应表示最后一次通过传输添加内容的时间
  2. rsync在不传输新内容的情况下比较源和目标时,目标文件时间戳不应更改

那么对于每个文件传输考虑因素,您至多最终会获得每个文件的完整校验和。因此,如果您传输了 100 个文件并且这 100 个文件存在于源和目标上,则每次运行时rsync都会对所有 100 个文件进行校验和以查看它们是否已更改。正如您可以想象的那样,这是极其低效的。

rsync --archive --no-times --checksum /source/path remotehost:/destination/path

您还没有解释您的用例,但通常的使用方法rsync是传输文件修改时间,以便可以避免传输看似已传输的文件:

rsync --times /source/path remotehost:/destination/path    # or --archive

像往常一样,--archive= -a, --times= -t, --no-times= --no-t, --checksum=-c

答案2

听起来您正在编写增量备份用例。

在 src 目录(或至少在 src 主机上)维护一个文件。

$ date +%s >> backed_up.txt

现在mtime,簿记文件始终对应于最近备份开始的时间。用于find . -newer backed_up.txt -type f比较时间戳并生成我们希望传输的文件列表。提供rsync该列表,并使用--archive或其他方式将其标记保留在 dst 目录中。


这里的关键是,对于目标文件,我们不会尝试更改时间戳的存储或使用方式。我们有一个分离建模的东西,我们把它放在它所属的地方,放在旁边的簿记文件中。所以find/rsync使用时间戳,而不是试图将一些新颖的用法硬塞到现有的文件系统中。


这是目标主机检测“新到达”文件的一种方法。它比重复stat()调用 mtime便宜,因为它只检查文件名。它假定独特的文件名不会很快被重复使用/附加。

#! /bin/bash

mv recent.{txt,old}
find some/dir -print | sort  > recent.txt
NEW=$(comm -1 -3 recent.{old,txt})

现在您可以for FILE in $NEW迭代,将最近的文件名提供给xargs,无论您的处理步骤可能需要什么。


这种方法依赖于标准实用程序 通讯。它出现在GNU中 文本工具

相关内容