我找到了该问题的多个答案,所以想问问真正使用它的人,而不是只想通过填写随机的半无用的信息来创建最大的博客。
场景:我
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 再次复制文件。