在 Linux 中可以使用该命令diff
来检查文件的差异。我用它来检查两个模块之间的差异,都复制到/tmp
.
但是,两个模块都有符号链接,它们可能没有指向正确的文件,因为这些模块已被复制到/tmp
目录中。但这没关系。我想检查的是符号链接是否相同。
例如,在一个模块中,符号链接读取
/home/test/file1
Run Code Online (Sandbox Code Playgroud)
在另一个符号链接中显示:
/etc/rc.d/whatever
Run Code Online (Sandbox Code Playgroud)
diff
现在抛出一个错误,因为 - 通常 - 它找不到文件。但我diff
想说:“嘿,这些符号链接不一样”,无论链接是否指向有效文件。
问题:怎么可能diff
做到这一点,即不尝试跟踪链接,而是区分链接本身?
尝试使用 GNU diff
3.3 或更高版本的--no-dereference
选项(大概是 --recursive 选项):
diff --recursive --no-dereference tree1root tree2root
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,您需要检查符号链接是否指向相同的理论目的地,或者如果一个不是符号链接,则另一个文件链接到同一文件。这应该做你想要的:
#!/bin/bash
if [[ "$(readlink -m -- "$1")" == "$(readlink -m -- "$2")" ]]; then
echo "files match"
else
echo "files don't match"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
$ > 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
Run Code Online (Sandbox Code Playgroud)