如何比较unix(Linux)中的2个符号链接?

时间:2009-07-14 09:41:55

标签: linux bash unix

在Unix中比较2个符号链接的优雅方法是什么?

假设我输入了以下命令:

ln -s /usr/share/g s1
ln -s /usr/share/g s2
ln -s ../share/g /usr/lib/s3
ln -s /usr/share/h s4

然后我希望有一个命令说s1和s2相等(/ usr / share / g实际存在是否相关),s1和s4不相等,s2和s4不相等。 (就我的目的而言,报告s3与s1和s2不同是足够的;但是如果可以在路径归一化之后进行比较,那么这可能是有用的。)

4 个答案:

答案 0 :(得分:12)

对于GNU系统(可能还有其他人,但我不能说),有readlink(1)

$ touch a
$ ln -s a b
$ readlink b
a

您可以在比较中使用它:

$ test $(readlink -f a) = $(readlink -f b)
$ echo $?
0

答案 1 :(得分:3)

您可以对文件执行stat -L并比较设备和inode编号。 快速举例:

#!/bin/bash
DI_A=$(stat -c "%d.%i" -L "$1")
DI_B=$(stat -c "%d.%i" -L "$2")

if [ "$DI_A" == "$DI_B" ]; then
   echo "same file"
else
   echo "other file"
fi

答案 2 :(得分:0)

使用stat -L或解析ls -l的输出(使用sed或cut或类似):

fileone=`ls -l s1 | sed 's/.*-> //'`
filetwo=`ls -l s2 | sed 's/.*-> //'`
if [ "$fileone" = "$filetwo" ]
then
    echo "They're the same!"
fi

要规范化路径,请使用realpath:

fileone=`ls -1 s1 | sed 's/.*-> //'`
fileone=`realpath $fileone`
# etc...

答案 3 :(得分:-1)

我能想到的两种方法,你可以在两个文件上使用ls -l。你可以在“ - >”之后看到输出的实际路径.eg

# ls -ltr msdfasdffff
lrwxrwxrwx 1 root root 10 Jun 30 19:05 msdfasdffff -> blah.sh

您可以使用

获取文件名
# ls -l msdfasdffff  | awk -F"-> " '{print $NF}'
blah.sh

然后你可以与另一个链接进行比较。

另一种方法是使用find

# var1=$(find . -name "s1" -printf "%l")
# var2=$(find . -name "s2" -printf "%l")

然后你可以使用if / else

比较2个变量