假设我设置了一个符号链接:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
myothertextfile.txt
有没有办法通过命令行查看目标是什么?
答案1
使用-f
标志打印规范化版本。例如:
readlink -f /root/Public/myothertextfile.txt
从man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
答案2
readlink 是您想要的命令。您应该查看该命令的手册页。因为如果您想跟踪指向实际文件的符号链接链,则需要 -e 或 -f 开关:
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
答案3
这也行得通:
ls -l /root/Public/myothertextfile.txt
但readlink
更适合在脚本中使用而不是解析ls
。
答案4
这readlink
是个好东西,但它是 GNU 独有的,并且不是跨平台的。我曾经为 编写过跨平台脚本/bin/sh
,因此我会使用类似这样的脚本:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
或者:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
但这些需要在不同的平台上进行测试。我认为它们会起作用,但不能 100% 确定ls
输出格式。
的结果也可以在不依赖诸如或之类的外部命令的情况下ls
进行解析。bash
awk
sed
perl
此bash_realpath
函数解析链接的最终目的地(链接→链接→链接→最终):
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# >&1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}