2009-07-14 43 views
3

比较Unix中2个符号链接的优雅方式是什么?如何比较unix(Linux)中的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 /共享/克是否实际存在是不相关的)的命令时, s1和s4不相等,s2和s4不相等。 (对于我的目的,足以说明s3与s1和s2有所不同;但是如果可以在路径规范化之后进行比较,则可能对此有用)。

回答

12

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

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

您可以使用在比较:

$ test $(readlink -f a) = $(readlink -f b) 
$ echo $? 
0 
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 
+1

它似乎不适用于悬挂链接。 – 2009-07-15 13:16:35

0

要么使用stat -L或解析的ls -l输出(使用sed或切割或类似的):

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

为了标准化路径,使用真实路径:

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

中断包含“ - >”的文件名...感谢realpath提示。 – 2009-07-15 13:15:55

+0

真的......不能说我曾经有过任何带有 - >的文件。 Readlink绝对是您的选择。 – DrAl 2009-07-15 13:18:46

-1

我可以想到的两种方式,你可以在两个文件上使用ls -l。 “ - >”你可以看到后输出的实际path.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 

那么你可以与其他链接比较得到的文件名。

的另一种方法是使用发现

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

那么你可以使用比较两个变量的if/else

+0

thx,但awk方法在包含“ - >”的文件名上打断为子字符串; find方法起作用,但是有一些条件限制搜索到一个文件;我更喜欢readlink命令。 – 2009-07-15 13:14:26