rsync:比较目录与符号链接

EML*_*EML 9 rsync symlink

这里有各种类似的问题,但我认为没有一个能很好地回答这个问题。

我有一个本地目录 ( www),它必须在远程服务器上完全镜像,我需要确认它们是精确的副本。

www包含指向内部其他文件的符号链接www(链接指向常规文件和目录)。此命令将比较两个版本的www,不包括本地 svn 目录作为奖励,并仅打印不同的文件:

[local]$ rsync -rvnc --exclude=.svn/ --delete www/ remote:/var/www/
Run Code Online (Sandbox Code Playgroud)

它不遵循符号链接,只是报告它们不是常规文件。所以,我需要取消引用符号链接,并比较它们的目标。这rsync -rvncLrsync -rvncK没有 --L打印出许多没有区别的文件(无论如何我都可以看到),并且-K什么都不做。有任何想法吗?

94b*_*4b1 0

使用带有符号链接的普通命令非常棘手。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