最小工作示例
- 假设我们有两个目录
a
,b
- 文件
1.txt
存在于a
且包含foo
- 我们复制
a/1.txt
到b
使用rsync
- 文件
a/1.txt
被修改,现在包含bar
- 为了获得更新的版本
a/1.txt
,b
我们rsync
再次执行
此时a/1.txt
包含bar
,而b/1.txt
包含foo
。
通过执行以下命令可以重现上述场景。
mkdir a b
echo foo > a/1.txt
rsync -a a/ b
echo 'After first run'
cat a/1.txt
cat b/1.txt
echo bar > a/1.txt
rsync -a a/1.txt b/
echo 'After second run'
cat a/1.txt
cat b/1.txt
After first run
foo
foo
After second run
bar
foo
正如您上面看到的,在第二次运行中,的内容b/1.txt
并没有随着的内容而更新。a/1.txt
问题
如何rsync
更新上次运行中复制的文件的内容?
系统信息
$ rsync --version
rsync version 3.2.7 protocol version 31
Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, symlinks, symtimes, hardlinks, hardlink-specials,
hardlink-symlinks, IPv6, atimes, batchfiles, inplace, append, ACLs,
xattrs, optional secluded-args, iconv, prealloc, stop-at, no crtimes
Optimizations:
SIMD-roll, no asm-roll, openssl-crypto, no asm-MD5
Checksum list:
xxh128 xxh3 xxh64 (xxhash) md5 md4 sha1 none
Compress list:
zstd lz4 zlibx zlib none
Daemon auth list:
sha512 sha256 sha1 md5 md4
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
答案1
rsync
通常会比较源文件和目标文件的大小和修改时间,如果它们匹配,则假定文件相同。在此示例中,文件大小相同(4 字节),并且 b/1.txt 的修改时间紧随 a/1.txt 之后,因此时间戳相同。
如果您sleep 1
在脚本的两个部分之间添加一个命令,它应该可以工作(除非您使用的是 FAT 卷 - 它的时间戳只有 2 秒的分辨率,因此您必须延迟 2 秒才能获得一致的结果)。
或者,您可以添加-I
标志以rsync
使其忽略时间戳,并实际验证文件的内容是否匹配(或至少是它们的校验和)。