rsync如何准确决定要同步的内容?


15

我正在寻找该问题的多个答案,因此想问一个实际使用它的人,而不是只想通过填写随机的半无用信息来创建最大的博客。

场景:我 rsync -av --progress /dir/a /dir/b 做到了。

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

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

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

作为奖励,如果以前复制的文件再次复制,是有办法防止这一点,所以,只有新加入/ DIR / A被复制?

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


3
-i标志非常方便。对于每个文件,它都提供一个匹配字符串,可以对该字符串进行解码,以查看其匹配原因(mod时间标志,大小标志等)
BowlOfRed

Answers:


17

我将新文件添加到/ 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

我见过的最好的描述(到目前为止),谢谢
SPooKYiNeSS

2
一点补充。重命名的文件在两端均被视为唯一文件。指定--fuzzy一次将在同一目录中将它们识别为相同。使用--fuzzy两次可将此功能扩展到其他位置。有关man rsync详细信息,请参见。当然,使用的主要原因之一rsync是它能够仅复制文件中已更改的部分。这可以使通过网络的传输更快。顺便说一句,上面提到了校验和选项,以解释其rsync工作原理。在大多数情况下,不应使用它。

6

一般

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

提示

  • 使用选项-n“空运行”来检查在运行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)。


很好的例子,谢谢。我也知道在最后的事情/,我只是从应用程序要求这一点,错过了(你可以清楚地看到我只是复制/贴
SPooKYiNeSS

然后它在我完成之前发送,并且不会让我编辑我的评论...复制/粘贴了第二个。我将看一下unuson,看看它是否可以满足我的要求,否则,我将回到计划b并编写一个脚本
SPooKYiNeSS

我已经使用unison-gtk了几年了,对此我感到很满意。(我也使用rsync。)
sudodus

1

它仅将新文件复制到/ dir / a中。除非您使用--delete选项,否则您在/ dir / b中所做的任何操作都将被忽略。在这种情况下,/ dir / b中重命名的文件将被删除。它将迫使/ dir / b变得完全类似于/ dir / a。

关于奖金,您是说要重命名/ dir / a中的文件,然后rsync到/ dir / b吗?我不认为有一种方法可以防止rsync仅在这种情况下再次复制文件。


除了使用属性来确定属性外,我没想到有其他方法,但是如果要制作一个小孩子脚本并且有需要的话。不过,谢谢您的回答,至少我现在知道我需要做什么。
SPooKYiNeSS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.