如何查找软链接的原始文件?
例如,我有一个文件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 d
, readmultilinks c
和readmultilinks 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