例如,我有一个文件a
,并且我执行以下操作。
ln -s a b
ln -s b c
ln -s c d
如果我使用readlink d
,我就会得到c
。所以我必须运行多次才能得到a
。
有没有什么简单的方法可以得到a
?
更新:
如果我想找到 的原始文件/usr/bin/java
,我必须多次才能找到/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
。文件和链接是不是在同一个文件夹中。
答案1
用于跟踪链接链的命令被命名为namei
手册页。 例子:
$ touch a
$ ln -s a b
$ ln -s b c
$ ln -s c d
$ namei ./d
f: ./d
d .
l d -> c
l c -> b
l b -> a
- a
$ namei /usr/bin/java
f: /usr/bin/java
d /
d usr
d bin
l java -> /etc/alternatives/java
d /
d etc
d alternatives
l java -> /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
d /
d usr
d lib
d jvm
d java-7-openjdk-i386
d jre
d bin
- java
答案2
您可以使用以下 shell 函数:
readmultilink () {
linkfile="$1"
if [ ! -L "$linkfile" ]; then
echo "$linkfile is not a simbolik link" >&2
return 1
fi
until [ ! -L "$linkfile" ]; do
lastlinkfile="$linkfile"
linkfile=$(readlink "$lastlinkfile")
done
readlink "$lastlinkfile"
}
~/.bashrc
如果您想每次打开终端时使用它,请在文件末尾添加此功能。
用法:
readmultilinks file_name
举例来说,对于您的示例,readmultilinks d
,readmultilinks c
和readmultilinks b
将返回a
,但readmultilinks a
将返回a is not a simbolik link
。
答案3
一个简单的解决方案:
readlink -f /path/to/file
答案4
你可能需要找到:
$ find -L . -samefile d
./b
./c
./d
./a
或者:
$ ls -i d
143075 d
$ find . -follow -print -inum 143075
.
./b
./c
./d
./a
两种情况原始文件都是最后一个。