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

比较Unix中两个符号链接的优雅方式是什么?

假设我input了以下命令:

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不同,但是如果可以在path规范化之后进行比较,那可能是有用的)。

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

 $ touch a $ ln -sab $ readlink b a 

你可以在比较中使用它:

 $ test $(readlink -fa) = $(readlink -fb) $ echo $? 0 

你可以在文件上做一个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 

使用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 

要规范化路径,请使用实际路径:

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

我可以想到的两种方式,你可以在两个文件上使用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 

那么你可以与另一个链接进行比较。

另一种方式是使用find

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

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