这里有各种类似的问题,但我认为没有一个能完全回答这个问题。
我有一个本地目录 ( www
),它必须精确镜像到远程服务器上,并且我需要确认它们是精确的副本。
www
包含到内部其他文件的符号链接www
(链接到常规文件和目录)。此命令将比较 的两个版本www
,不包括本地 svn 目录作为奖励,并仅打印不同的文件:
[local]$ rsync -rvnc --exclude=.svn/ --delete www/ remote:/var/www/
但它不遵循符号链接,只是报告它们不是常规文件。因此,我需要取消引用符号链接,并比较它们的目标。这也没有 -打印rsync -rvncL
出许多没有不同的文件(无论如何我都可以看到),并且什么也不做。有任何想法吗?rsync -rvncK
-L
-K
答案1
使用带有符号链接的普通命令非常棘手。find
命令可以很好地处理它们。所以关键是使用find
,我建议根据您的需要使用快速 CRC 或加密哈希函数。
所以这样的东西应该有效(你可以根据需要进行补充)
find -L www -type f -exec cksum {} \; | cut -d ' ' -f1-2 | md5sum
如果您想要校验和的加密支持,
find -L www -type f -exec sha256sum {} \; | cut -d ' ' -f1 | sha256sum
“类型”标识符是必需的,因为 sha256 仅适用于文件和目录错误,并且剪切仅用于将校验和/哈希传递到最终函数并避免误报,而实际上只有路径名不同。
注意:如果符号链接不是相对的,并且如果两个系统没有完全相同的路径(如果符号链接指向您正在运行的目录之外,则可能会发生这种情况),这将失败find
。
答案2
有关更多信息,我认为解决方案是使用rsync
跟踪链接或复制链接本身的选项。
--links, -l copy symlinks as symlinks
此选项也包含在常规“--archive”选项中。
--archive, -a archive mode is -rlptgoD (no -A,-X,-U,-N,-H)
仅供参考,就我自己的例子而言,我在使用 rsync 时通常使用“-Pav”。
$ rsync -Pav SOURCE DEST
至少这个选项在 CentOS Stream 9 (rsync 3.2.3) 和 Ubuntu 22.04 (3.2.7) 中可用。