通过命令行找出符号链接目标

通过命令行找出符号链接目标

假设我设置了一个符号链接:

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进行解析。bashawksedperl

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}"
}

相关内容