如何找到软链接的原始文件?

如何找到软链接的原始文件?

例如,我有一个文件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 dreadmultilinks creadmultilinks 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

两种情况原始文件都是最后一个。

相关内容