我想使用 rsync 比较两个目录及其文件内容并将其传输到新的空目录。所以我创建了一个小的 POC:
OLD/
...main.js
NEW/
...main.js
CHANGES/
NEW 和 OLD 中的 main.js 文件是相同的,并且具有相同的校验和。但是当我使用时:
rsync -rvcm --compare-dest=OLD/ NEW/ CHANGES/
main.js 文件仍然被复制到 CHANGES 文件夹中。我如何确保它不会这样做?我只想复制具有不同校验和的文件。
答案1
--compare-dest=DIR
[…]
如果
DIR
是相对路径,则相对于目标目录。 […]
(来源:man 1 rsync
)
在你的指挥下
rsync -rvcm --compare-dest=OLD/ NEW/ CHANGES/
OLD/
是相对路径。目标目录是CHANGES/
. OLD/
“相对于目标目录”意味着它实际上是CHANGES/OLD/
相对于当前工作目录的。您的设置中很可能不存在该目录。即使它存在,它也不是您所指的目录。
您的意思是OLD/
在当前工作目录中,可以将其称为CHANGES/../OLD/
.相对于 的部分CHANGES/
是../OLD/
,因此:
rsync -rvcm --compare-dest=../OLD/ NEW/ CHANGES/
请注意,如果CHANGES
是指向目录的符号链接,则CHANGES/../
不一定./
(比较ls ..
当我位于符号链接目录中时,为什么会显示真正的父内容?)。在这种情况下CHANGES/../OLD/
并不意味着OLD/
。--compare-dest=…
根据以下内容构建论证身体的目录结构。
答案2
一般来说,最好包含时间戳并停止强制校验和
rsync -rtvm --compare-dest=OLD/ NEW/ CHANGES/
如果您要在 Linux 本机文件系统之间进行复制,您可能需要-a
使用-rt
.
由于您使用的是本地副本(NEW/
并且CHANGES/
似乎位于同一系统上),因此使用校验和进行验证是没有意义的 - 无论如何,仅复制文件的速度都会大致相同。