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

例如,我有一个文件a ,我执行以下操作。

 ln -sab ln -sbc ln -scd 

如果我使用readlink d ,我会得到c 。 所以我必须跑多次才能得到a

有一个简单的方法来获得?

更新:

如果我想找到/usr/bin/java的原始文件,我必须多次执行以获取/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 。 文件和链接不在同一文件夹中。

以下链接链的命令名为namei ManPage 。 例子:

 $ touch a $ ln -sab $ ln -sbc $ ln -scd $ namei ./d f: ./d d . ld -> c lc -> b lb -> 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 

您可以使用以下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文件的末尾添加此function。

用法:

 readmultilinks file_name 

例如,对于您的示例, readmultilinks dreadmultilinks creadmultilinks b将返回a ,但readmultilinks a将返回a is not a simbolik link

您可能需要找到:

 $ find -L . -samefile d ./b ./c ./d ./a 

要么:

 $ ls -id 143075 d $ find . -follow -print -inum 143075 . ./b ./c ./d ./a 

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

简单的解决方案:

 readlink -f /path/to/file