热使差异检查本身的符号链接链接?


8

在Linux中,可以使用该命令diff检查文件的差异。我用它来检查两个模块之间的差异,两者都复制到/tmp

但是,两个模块都有符号链接,因为它们已复制到/tmp目录中,所以它们可能未指向正确的文件。但这无关紧要。我要检查的是符号链接是否相同。

例如,在一个模块中,符号链接读取

/home/test/file1

而另一个符号链接显示为:

/etc/rc.d/whatever

diff现在会引发错误,因为-通常-它找不到文件。但是我diff想说:“嘿,那些符号链接不一样”,无论这些链接是否指向有效文件。

问题:如何diff做到这一点,即不尝试跟随链接,而是对链接本身进行区分?

Answers:


6

尝试diff使用带有该--no-dereference选项的GNU 3.3或更高版本(大概是--recursive选项):

diff --recursive --no-dereference tree1root tree2root

你能把这个充些吗?也许举一个如何使用它的例子?这样可以得到一个很好的答案,但是我们希望我们的答案在这里更加明确和冗长。
terdon

3

从3.3版开始,GNU diff不支持不解引用符号链接,而是比较它们指向的路径。

安装GNU diffutils> = 3.3并使用'--no-dereference'选项;没有简短的选择。

如果路径相等,则诊断将保持沉默,或者:

Symbolic links /tmp/noderef/a/symlink and /tmp/noderef/b/symlink differ

如果路径不同。


1

使用GNU工具:

diff <(cd dir1 && find . -type l -printf '%p -> %l\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p -> %l\n'|sort)

严格地说,这不能称为符号链接区分a这点b -> c和一个叫a -> b这点c,更何况与含换行字符的文件名比更强大更清晰输出的问题,但品牌:

diff <(cd dir1 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort)

在那里,我们//用作分隔符(在findfor 的输出中否则不会发生%p),并将换行符转换为NUL字符(在%pnor 的扩展中不会发生%l)。


1

如果我理解正确,则需要检查符号链接是否指向相同的理论目标,或者如果其中一个不是符号链接,则另一个文件链接至相同的文件。这应该做您想要的:

#!/bin/bash

if [[ "$(readlink -m -- "$1")" == "$(readlink -m -- "$2")" ]]; then
    echo "files match"
else
    echo "files don't match"
    exit 1
fi
$ > foo 
$ ln -s foo bar
$ ln -s foo baz
$ ./script bar baz
files match
$ ./script bar foo
files match
$ ln -sf qux bar
$ ./script bar foo
files don't match

@StephaneChazelas这是我的错误,我打算使用-m而不是-f。谢谢!
克里斯·唐尼

严格来说,如果唯一的区别是符号链接的目标中的尾随换行符的数量,那将是行不通的。
斯特凡Chazelas

我不会使用-m
斯特凡Chazelas

@StephaneChazelas是什么原因?没有它,真正指向同一文件的相对符号链接将无法通过比较。
克里斯·

如果/home/test/file1是的符号链接/etc/rc.d/whatever,或者它们都是的符号链接/,则会报告它们是相同的。我认为OP希望查看符号链接中存储的“路径”的差异,而不是它们是否解析为相同的文件(您拥有的文件[[ a -ef b ]])。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.