这个问题是基于我之前的问题。我在两台机器(A 和 B)上有相同的文件结构。这些文件相同,但时间戳不同(A 上的时间正确,B 上的时间错误)。上面提到的问题就是在处理这个问题。
但是,我尝试了以下技巧。我通过以下方式将机器B上结构中所有文件的修改时间更改为1.1.1970:
awk 'BEGIN{FS="\t"}{print "touch --no-create --no-dereference -m -t \"197001010000\" \"" $1 "\""}' files.txt > commands2.sh
parallel < "commands2.sh"
请注意,该文件files.txt
是在计算机 A 上生成的,并且包含每行: 其中
"$1"\t"$2"
给出$1
文件的绝对路径,并$2
具有由 输出的修改日期stat -c %y $1
。
我验证了stat
文件日期确实设置为 1970 年。我使用 Krusader 目录同步进行测试,Krusader 决定正确地将数据从 A 复制到 B。
然后我rsync
先测试A -> B
:
rsync -azEX --dry-run --itemize-changes --info=BACKUP1,DEL1,NAME1,REMOVE1 --delete --exclude-from=/home/user/.rsync-transport-in-ssh.rules /home/user user@remote:/home/user/
输出为空。然后B -> A
rsync -azEX --dry-run --itemize-changes --info=BACKUP1,DEL1,NAME1,REMOVE1 --delete --exclude-from=/home/user/.rsync-transport-in-ssh.rules user@remote:/home/user/ /home/user
输出充满了应该进行的传输,但这完全不正确,因为 B 上的所有数据都是 1970 年的。
因此,问题有两个方面:1)真正rsync
用什么来决定复制到哪里?2)有没有办法按照我想要的方式强制执行行为?
请注意,我怀疑rsync
实际上使用的是文件状态更改日期,因为我没有更新这些日期B
,并且在许多情况下这些日期早于A
.
答案1
- rsync 到底用什么来决定复制到哪里?
- 有什么方法可以按照我想要的方式强制执行行为吗?
rsync
使用多种不同的方法来确定是否复制文件内容。例如,- 文件大小和时间戳的比较
- 内容校验和
- 源和目标的位置(即它们位于同一文件系统中还是位于不同的服务器上)
请注意,
rsync
传输文件元数据(有关文件的数据,例如权限、所有权、时间戳等)和文件内容之间存在区别。此外,在涉及两个系统的情况下,rsync
可以使用校验和来确定文件内容的哪些部分发生了变化,这样只需要传输变化的部分而不是整个文件。
将文件复制到远程服务器。现在修改本地副本,以便有一个额外的字节在开始。用于rsync
复制文件,您会发现它只用一个数据块传输一串块校验和流。在我的 600MB 文件示例中,源和目标的上传速度受到 1Mbit/s 的限制,在其中一个实例的前面添加一个字节,源文件的“复制”花费了 20 秒,平均有效速度415Mbit/s。
- 回答于你之前的问题