有没有办法查看符号链接的实际内容?

Posted

技术标签:

【中文标题】有没有办法查看符号链接的实际内容?【英文标题】:is there a way to see the actual contents of a symlink? 【发布时间】:2011-06-02 03:35:13 【问题描述】:

当你这样做时

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

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

【问题讨论】:

你想用什么编程语言来做这个? 底层系统调用是readlink(2)。如其中一个答案所述,在某些系统(GNU 和相关系统)上使用的直接命令是readlink(1)。在其他系统上——HP-UX、Solaris、AIX——最接近的方法可能是ls -l,但如果链接中的路径名包含换行符或其他奇怪的字符,请注意问题。 【参考方案1】:

试试

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

【讨论】:

此命令将查找从当前目录开始的所有链接。本质上是ls -l,负责显示每一个的内容。【参考方案2】:

ls -l 命令会告诉你:

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

或者readlink command:

$ readlink foo
/etc/passwd

所以,符号链接foo 指向路径/etc/passwd

【讨论】:

为了更清楚一点,符号链接的“内容”也不过是它所指向的名称。 @Ben:嗯,shell是右手的编程语言,所以区别并不完全清楚。 @ijw:确实如此。但是,我们不必为了确定这不是程序员方面的问题而准确地确定那条线。此外,这些甚至都不是 shell 命令,lsreadlink 都是独立的应用程序。 @Ben:再一次,嗯。脚本中的大多数行都运行单独的程序,这就是 Unix 的本质。这条线是一条宽阔而灰色的线。不过,他似乎有理由将它用于脚本而不是在命令行上使用,这类似于其他语言中的“什么是执行 xxx 的库函数”问题。 @CMCDragonkai 硬链接本身没有内容。它只是指向一个inode。您可以使用statls -di 获取inode。【参考方案3】:

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

请注意,结果有一个长度(存储在返回值中)而不是 NUL 终止。所以如果你想把它当作一个字符串来使用,你自己附加一个 NUL。

大多数高级/脚本语言,例如 perl 或 python,将提供一个 readlink 包装器,该包装器可以转换为通常的语言适当的字符串类型,因此您不会被诸如 NUL 终止之类的细节所困扰。

【讨论】:

【参考方案4】:

关于手册页http://man7.org/linux/man-pages/man7/symlink.7.html 符号链接是常规文件(带有特殊标志),其内容中包含目标路径。所以你可以将符号链接复制到 FAT 分区并在那里读取它的内容。

【讨论】:

以上是关于有没有办法查看符号链接的实际内容?的主要内容,如果未能解决你的问题,请参考以下文章

readlink 查看符号链接的文件的内容

有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?

重新链接符号,以便“跳转到定义”在 Xcode 4.6 中有效

通过 rpmbuild 打包符号链接?

如何防止 IIS 7.5 缓存符号链接内容?

使用 Qt 重命名符号链接