在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不同是足够的;但是如果可以在路径归一化之后进行比较,那么这可能是有用的。)
答案 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个变量