这里有各种类似的问题,但我认为没有一个能很好地回答这个问题。
我有一个本地目录 ( www
),它必须在远程服务器上完全镜像,我需要确认它们是精确的副本。
www
包含指向内部其他文件的符号链接www
(链接指向常规文件和目录)。此命令将比较两个版本的www
,不包括本地 svn 目录作为奖励,并仅打印不同的文件:
[local]$ rsync -rvnc --exclude=.svn/ --delete www/ remote:/var/www/
Run Code Online (Sandbox Code Playgroud)
但它不遵循符号链接,只是报告它们不是常规文件。所以,我需要取消引用符号链接,并比较它们的目标。这rsync -rvncL
也rsync -rvncK
没有 --L
打印出许多没有区别的文件(无论如何我都可以看到),并且-K
什么都不做。有任何想法吗?
使用带有符号链接的普通命令非常棘手。find
命令可以很好地处理它们。所以关键是使用find
,我建议根据您的需要使用快速 CRC 或加密哈希函数。
所以这样的东西应该有效(你可以根据需要进行补充)
find -L www -type f -exec cksum {} \; | cut -d ' ' -f1-2 | md5sum
Run Code Online (Sandbox Code Playgroud)
如果您想要校验和的加密支持,
find -L www -type f -exec sha256sum {} \; | cut -d ' ' -f1 | sha256sum
Run Code Online (Sandbox Code Playgroud)
“类型”标识符是必需的,因为 sha256 仅适用于文件和目录错误,并且剪切仅用于将校验和/哈希传递到最终函数并避免误报,而实际上只有路径名不同。
注意:如果符号链接不是相对的,并且两个系统没有完全相同的路径,则这将失败,如果符号链接指向您正在运行的目录之外,则可能会发生这种情况find
。