为了在 shell 脚本中使用,我正在寻找一种命令行方式来获取符号链接的目的地。到目前为止我最接近的是stat -N src
,它输出src -> dst
.当然,我可以解析输出并 get dst
,但我想知道是否有一些直接的方法来获取目的地。
答案1
另一种选择是使用专门设计的命令(readlink
如果可用)。
例如
$ readlink -f `command -v php`
/usr/bin/php7.1
答案2
在 Mac OS X 和 FreeBSD/NetBSD/等上。它是:
stat -f %Y <filename>
更一般地说,我猜解决方案是(stat --printf=%N 使用奇怪的引号):
ls -l b | sed -e 's/.* -> //'
例子:
# ln -s a b
# stat -f %Y b
a
另一种方法是:
# find b -maxdepth 0 -printf %l
a#
最后一行被破坏了,因为它没有换行符,但如果您需要变量中的结果,那就没问题了,就像这样
# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a
如果碰巧是目录,则需要-maxdepth
防止find
下降到目录。b
答案3
find
这可以使用 GNU :来完成find src -prune -printf "%l\n"
。
答案4
在没有readlink
或stat
命令但有 Python 2.x 的系统上,我使用一个简短的脚本:
#!/usr/bin/env python
import os, sys
if __name__ == "__main__":
src = sys.argv[1]
target = os.readlink(src)
if not os.path.isabs(target):
target = os.path.abspath(os.path.join(os.path.dirname(src), target))
print target
请注意,与readlink -f
此不同的是,可能仅遵循一层符号链接。