最小工作示例

最小工作示例

最小工作示例

  1. 假设我们有两个目录ab
  2. 文件1.txt存在于a且包含foo
  3. 我们复制a/1.txtb使用rsync
  4. 文件a/1.txt被修改,现在包含bar
  5. 为了获得更新的版本a/1.txtb我们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使其忽略时间戳,并实际验证文件的内容是否匹配(或至少是它们的校验和)。

相关内容