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

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


评论


根据另一个问题的建议,您可能要使用readlink -f。

– DenilsonSáMaia
2014年6月7日下午0:14

要在Mac OS X上运行此功能,请brew安装coreutils。这将安装基本gnu版本的以字母g开头的命令,即greadlink -f somefile

– Mike D
16-2-21在20:47

使用-f开关,在我的情况下,命令不返回任何内容。

–sotn
18年7月19日在8:08

使用-f给了我想要的信息,即解决了多个符号链接并显示了最终目标。

–isapir
18-10-15在19:52

在Ubuntu 18.04.1 LTS(Bionic Beaver)上,readlink的联机帮助页上有一条注释,上面写着“ Note realpath(1)是用于规范化功能的首选命令”。

– Shmuel Kamensky
19年7月1日在15:32



#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


评论


第一个答案没有错,但是这个答案更完整,更有用。

– Mike S
18年5月11日15:30

#3 楼

这也将起作用:

ls -l /root/Public/myothertextfile.txt


,但是readlink更适合在脚本中使用,而不是解析ls

#4 楼

如果要显示链接的源和目标,请尝试stat -c%N files*。例如

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’


不好解析(使用readlink),但是它显示链接名称和目标,没有ls -l的混乱

> -c可以写为--format,而%N的意思是“如果使用符号链接,则引用文件名并取消引用”。

#5 楼

readlink是一件好事,但是是GNU特定的非跨平台的。我曾经为/bin/sh编写跨平台脚本,因此我会使用类似以下内容的代码:

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'


或:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print }'


,但是这些需要在不同的平台上进行测试。我认为它们会起作用,但不能100%确定ls的输出格式。

也可以在ls中解析bash的结果,而不必依赖于awksedperl之类的外部命令。

bash_realpath函数可解析链接的最终目的地(链接→链接→链接→最终):

 bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # >&1: the resolved link path

  local path=""
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}
 


#6 楼

如果不能使用readlink,则可以这样解析ls -l的结果。

正常结果将是:

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt


因此,我们希望替换“->”和包括箭头之前的所有内容。我们可以为此使用sed

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt


#7 楼

这个问题不够准确,无法给出简单的答案,因为brian-brazil的问题之一:

readlink -f some_path


的确会取消引用路径构造中涉及的每个符号链接到最终目标在some_path后面。

但是级联符号链接的一个级别只是系统中其他情况的一种特殊情况,一般情况是N级级联符号链接。在我的系统上查看以下内容:

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x


rwhich是我自己的which的递归实现,它将所有中间级联符号链接(到stderr)打印到最终目标。 (到stdout)。

然后,如果我想知道什么是:



symlink的目标/ usr / bin / emacs ** ,对我来说,最明显的答案是/etc/alternatives/emacs,由以下命令返回:

readlink $(which emacs)
readlink /usr/bin/emacs



级联符号链接/ usr / bin / emacs的最终目标是/usr/bin/emacs24-x,返回者:

readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null




#8 楼

llls -l应该列出目录项,包括符号链接及其目标

cd -P /root/Public/myothertextfile.txt(在您的情况下)应指向原始路径

#9 楼

如果找到文件夹及其子文件夹中所有链接的目标,请使用find . -type l -ls命令,其链接类型如下:

me@local.localdomain:~/test$ find . -type l -ls
8601855888        0 lrwxr-xr-x    1 me           staff                   6 Jan 24 19:53 ./link -> target


如果要使用单个目标,那么ls -l应该可以工作:

me@local.localdomain:~/test$ ls -l 
total 0
lrwxr-xr-x  1 me  staff  6 Jan 24 19:53 link -> target
-rw-r--r--  1 me  staff  0 Jan 24 19:53 target