rsync 究竟如何决定同步什么?

rsync 究竟如何决定同步什么?

我找到了该问题的多个答案,所以想问问真正使用它的人,而不是只想通过填写随机的半无用的信息来创建最大的博客。

场景:我 rsync -av --progress /dir/a /dir/b 和它做了它的事情。

我将新文件添加到 /dir/a 并再次运行相同的命令,它知道它做了什么并且只复制新文件。

我将新文件添加到 /dir/a 并重命名 /dir/b 中的某些文件,也许还删除了一些文件。

如果我rsync -av --progress /dir/a /dir/b再次运行,将复制什么?仅复制新文件,因为它知道以前复制过的内容,或者复制已重命名/删除的文件,因为它们不再存在。

另外,如果之前复制的文件再次复制,有没有办法防止这种情况发生,以便只复制 /dir/a 中新添加的内容?

目前我很乐意手动检查,但随着数据越来越大,我将需要更多的自动化来执行此任务。

答案1

我将新文件添加到 /dir/a 并再次运行相同的命令,它知道它做了什么并且只复制新文件。

不,它不知道上次运行做了什么。它会将接收端的数据与要发送的数据进行比较。如果数据足够小,这一点不会很明显,但是如果目录足够大,在实际开始复制之前,比较所花费的时间很容易感觉到。

默认检查的是文件修改时间和大小。man rsync

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

和:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

请注意,您使用的选项并未暗示这些。-a是:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

答案2

一般的

如果我理解正确的话,rsync -av没有记忆,所以它也会复制已重命名/删除的文件,因为它们存在于源中但不再存在于目标中。

尖端

  • 使用选项-n“dry run”来检查运行rsync命令行之前发生的情况。

  • 注意源目录后面尾部斜杠的特殊含义,并查看以下区别:

    rsync -av --progress dir/a/ dir/b
    

    rsync -av --progress dir/a dir/b
    

    这在手册中有描述man rsync

例子

您的特殊情况(将文件添加到源目录“a”并从目标目录“b”中删除文件)将同时添加添加的文件和之前复制的文件,因为它仍在源目录中。无论有没有该选项都会发生这种情况,如果您想将其保留在源目录中,-u我不知道有什么选项可以rsync轻松解决这个问题。

但是您可以将其从源目录中删除,或者将文件名放入文件中excluded并使用该选项--exclude-from=excluded(对于许多文件)或仅--exclude=PATTERN对于一个或几个文件。

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

选择:unison

你可能想测试一下这个工具unison,这是一个同步工具。它提供了一种可视化方法来识别特殊情况并决定要做什么。有一个 GUI 版本(unison-gtk)。

答案3

它仅复制 /dir/a 中的新文件。除非使用 --delete 选项,否则您在 /dir/b 中执行的任何操作都将被忽略。在这种情况下,/dir/b 中的重命名文件将被删除。它将强制 /dir/b 变得与 /dir/a 完全一样。

关于奖励,你的意思是像在 /dir/a 中重命名文件,然后 rsyncing 到 /dir/b 的情况一样吗?我认为在这种情况下没有办法阻止 rsync 再次复制文件。

相关内容