2009-08-06 7 views
43

Tôi có một chuỗi chứa đường dẫn hệ thống tệp đến một liên kết tượng trưng hiện có. Tôi muốn nhận được đường dẫn mà liên kết này trỏ tới.Làm cách nào để có được mục tiêu của một liên kết tượng trưng?

Về cơ bản tôi muốn cùng mà tôi muốn vượt qua bit này của hackery:

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

nhưng tôi muốn làm điều đó mà không cần bắn phá ra.

+0

Ngẫu nhiên, trong bash nó cũng chỉ là 'đường dẫn readlink/to/symlink'. Không bao giờ phân tích cú pháp đầu ra của 'ls'. – OrangeDog

Trả lời

60

Tôi nghĩ readlink là những gì bạn đang tìm kiếm:

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

Lưu ý rằng nếu liên kết tượng trưng là tương đối hoặc có một chuỗi các liên kết tượng trưng, ​​điều này sẽ không theo tất cả các liên kết hoặc trả về đường dẫn đầy đủ -Pathname # realpath sẽ. – mfazekas

+0

@mfazekas, cảm ơn bạn đã chỉ ra điều này; Tôi tự hỏi liệu đó có thực sự là những gì mà OP muốn; 'ls -ld ...' cũng không đưa ra đường dẫn thực. – Inshallah

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

hoặc readlink như những người khác nói

+3

thay Pathname.new ("/ path/to/symlink"). Realpath.to_s :) .. điều này chắc chắn tốt hơn việc sử dụng hệ thống() –

10

Hoặc bạn có thể thử:

File.realpath("symlink_path") 

Những công trình cho cả symlink và các tập tin bình thường.

+0

cần phải gắn vào 'readpath' nếu bạn muốn tương thích 1.8.7 – nhed