2009-08-06 15 views
43

Tengo una cadena que contiene la ruta del sistema de archivos a un enlace simbólico existente. Quiero obtener la ruta a la que apunta este enlace.¿Cómo obtengo el objetivo de un enlace simbólico?

Quiero básicamente el mismo que me gustaría conseguir a través de este pedacito de hackery:

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

pero quiero hacerlo sin desembolsar.

+0

Por cierto, en bash también es simplemente 'readlink path/to/symlink'. Nunca analice la salida de 'ls'. – OrangeDog

Respuesta

60

Creo readlink es lo que busca:

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

Tenga en cuenta que si el enlace simbólico es relativo o hay una cadena de enlaces simbólicos, esto no seguirá todos los enlaces ni devolverá la ruta completa -Pathname # realpath will. – mfazekas

+0

@mfazekas, gracias por señalar esto; Me pregunto si eso es realmente lo que el OP quería; 'ls -ld ...' tampoco da el camino real. – Inshallah

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

o readlink como otros dijeron

+3

más bien Pathname.new ("/ path/to/symlink"). Realpath.to_s :) .. esto es definitivamente mejor que usar el sistema() –

10

O puede probar:

File.realpath("symlink_path") 

que funciona tanto para los enlaces simbólicos y archivos normales.

+0

necesidad de apegarse a 'readpath' si quieres compatibilidad 1.8.7 – nhed

Cuestiones relacionadas