假设我设置了一个符号链接:
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
评论
第一个答案没有错,但是这个答案更完整,更有用。
– 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
的结果,而不必依赖于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=""
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 楼
ll
或ls -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
评论
根据另一个问题的建议,您可能要使用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