我正在通过网络将文件从 src 同步到 dst。我正在 Linux 手册页上浏览许多 rsync 选项,并且需要一些帮助。
目标上的进程响应来自源的“新到达”文件。例如,假设源文件的修改时间是两天前,但rsync
直到五分钟前才传输。我可以根据最近的时间戳来检测新到达的文件。
因此,我需要这种所需的时间戳行为:
- dst 文件修改时间戳应表示最后一次通过 rsync 传输添加内容的时间。
- 当 rsync 比较 src 和 dst 而不传输新内容时,即当 dst 已经与 src 匹配时,dst 文件修改时间戳不应更改。
哪些 rsync 选项提供了这种所需的行为?
答案1
你无法有效地做到这一点。rsync
使用时间戳作为缩短网络中长传输的主要手段。
如果你真的想要这种时间戳行为,
rsync
目标文件时间戳应表示最后一次通过传输添加内容的时间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
,无论您的处理步骤可能需要什么。