如何获取符号链接的目标?

53

我有一个字符串,包含指向现有符号链接的文件系统路径。我想获取此链接指向的路径。

基本上,我想获得与以下代码段通过技巧获得的相同结果:

s = "path/to/existing/symlink"
`ls -ld #{s}`.scan(/-> (.+)/).flatten.last

但我想在不使用外壳的情况下完成它。


2
顺便提一下,在bash中也只需使用readlink path/to/symlink命令。永远不要解析ls的输出。 - OrangeDog
3个回答

70

我认为你要找的是readlink

File.readlink("path/to/symlink")

16
请注意,如果符号链接是相对路径或存在一系列符号链接,则此操作将不会遍历所有链接或返回完整路径。使用Pathname#realpath方法则可实现。 - mfazekas
@mfazekas,感谢您指出这一点;不过我想知道这是否真的是OP想要的;ls -ld ...也不能给出真实路径。 - Inshallah
换句话说:这个调用将解析symlink,但它既不会解析path也不会解析to - undefined

49
require 'pathname'
Pathname.new("symlink").realpath

如其他人所说,您可以使用readlink


3
更好的做法是使用Pathname.new("/path/to/symlink").realpath.to_s,而不是使用system()函数。 - Rishav Rastogi

16

或者您可以尝试:

File.realpath("symlink_path")

可同时用于符号链接和普通文件。


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