2009-08-06 12 views
43

Mam ciąg znaków zawierający ścieżkę systemu plików do istniejącego dowiązania symbolicznego. Chcę uzyskać ścieżkę, na którą wskazuje to łącze.Jak uzyskać cel dowiązania symbolicznego?

Zasadniczo chcę tym samym, że będę się za pośrednictwem tego kawałka hackery:

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

ale chcę to zrobić bez łuskanie obecnie.

+0

Nawiasem mówiąc, w bashie jest to po prostu 'readlink path/to/symlink'. Nigdy nie parsuj wyjścia 'ls'. – OrangeDog

Odpowiedz

60

myślę readlink jest to, czego szukasz:

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

Należy zauważyć, że jeśli dowiązanie symboliczne jest względne lub istnieje łańcuch dowiązań symbolicznych, nie będzie to oznaczać wszystkich linków lub zwróci pełną ścieżkę - Pathname = realpath. – mfazekas

+0

@mfazekas, dziękuję za wskazanie tego; Zastanawiam się, czy tak naprawdę to OP chciał; 'ls -ld ...' również nie daje prawdziwej ścieżki. – Inshallah

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

lub readlink jak inni mówili

+3

raczej Pathname.new ("/ path/to/symlink"). Realpath.to_s :) .. to zdecydowanie lepsze rozwiązanie niż przy użyciu systemu() –

10

Albo można spróbować:

File.realpath("symlink_path") 

które działa zarówno dowiązania i normalne pliki.

+0

trzeba trzymać się 'readpath', jeśli chcesz zgodność z 1.8.7 – nhed

Powiązane problemy