有没有一种方法可以查看符号链接的实际内容?

73
当您执行

cat some-symlink-to-some-real-file

它显示的是实际文件的内容,而不是符号链接本身的内容。有没有办法查看其中的内容?


2
你想用哪种编程语言来实现这个? - Ben Voigt
4
底层系统调用是readlink(2)。 如其中一个答案所述,在某些系统上直接使用的命令是readlink(1)(GNU和相关系统)。在其他系统 - HP-UX,Solaris,AIX上 - 最接近的方法可能是ls -l,但请注意,如果链接中的路径名包含换行符或其他奇怪字符,则可能会出现问题。 - Jonathan Leffler
5个回答

86

ls -l 命令将会显示以下内容:

$ ls -l foo
lrwxrwxrwx 1 user group 11 2010-12-31 19:49 foo -> /etc/passwd

或者使用readlink命令

$ readlink foo
/etc/passwd

因此,符号链接 foo 指向路径 /etc/passwd


28
为了更加清晰,符号链接的“内容”仅仅是它所指向的名称。 - wnoise
1
@Ben:嗯,Shell在正确的手中是一种编程语言,因此区分并不完全清晰。 - ijw
1
@ijw: 确实如此。但是我们不必精确地确定该行以便弄清楚这不是程序员的问题所在。此外,这些甚至不是shell命令,lsreadlink都是单独的应用程序。 - Ben Voigt
@Ben:再次,感觉一般。在Unix中,大多数脚本行都运行独立的程序,这是它的特性。这一行比较笼统和模糊。不过,他似乎很可能是想用于脚本而非命令行,这使得它类似于其他语言中的“有哪些库函数可以做xxx”的问题。 - ijw
1
@CMCDragonkai 硬链接本身没有内容。它只是指向一个inode。您可以使用statls -di获取inode。 - wjandrea

10

您可以调用readlink(2)函数,该函数将链接的名称放入缓冲区中。

请注意,结果具有长度(存储在返回值中),而不是以NUL结尾的字符串。因此,如果您要将其用作字符串,请自行添加NUL。

大多数高级/脚本语言(例如perl或python)将提供一个readlink包装器,可将其转换为通常适合该语言的字符串类型,因此您不必担心诸如NUL终止等细节问题。


3

1

尝试一下

find . -type l -exec ls -la {} \;

这个命令将会找到所有以当前目录为起点的链接。实际上,ls -l 命令负责显示每一个链接的内容。 - Eric Fortis

0
请看下面ls -l的结果。每个链接的大小正好是存储原始文件名所需的字节数。甚至没有最终的NUL,正如@BenVoigt所提到的那样。当然,这也不是文件的绝对路径。

result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接