2011-02-03 10 views
5

# Test-> a.plcómo obtener la ruta absoluta para el archivo symlink?

my $file = '/home/joe/test'; 
if (-f $file && -l $file) { 
    print readlink($file) ; 
} 

cómo obtener la ruta absoluta para el archivo de enlace simbólico?

+0

¿Estás diciendo que desea que la ruta absoluta del enlace simbólico o la ruta absoluta del archivo de los puntos de enlace simbólico a? – iain

+0

ruta absoluta del archivo, el enlace simbólico apunta a – Tree

+0

Entonces, en realidad solo quieres saber cómo obtener la ruta absoluta para un nombre de ruta dado, porque ya sabes cómo usar 'readlink()' para obtener un camino al apuntado-a archivo. –

Respuesta

10

Cwd proporciona dicha funcionalidad mediante abs_path.

#!/usr/bin/perl -w 

use Cwd 'abs_path'; 

my $file='/home/joe/test'; 
if(-f $file && -l $file) { 
    print abs_path($file); 
} 
+0

Cuidado, que probablemente saldrá mal cuando los nombres de archivo UTF-8 estén en uso. En ese caso, puede ser necesario algo como 'Encode :: decode_utf8 (Cwd :: abs_path ($ file));' –

3

si utiliza File :: Spec rel2abs junto con readlink que obtendrá el camino abs incluso si es un enlace simbólico a otro enlace simbólico

use File::Spec; 

$path = File::Spec->rel2abs(readlink($file)) ; 
+0

File :: Spec rel2abs no parece funcionar con múltiples enlaces. El abs_path de Cwd funciona. Pruebe 'touch/tmp/target; ln -s target/tmp/link1; ln -s link1/tmp/link2' y comparar 'perl -MFile :: Spec -e '$ f ="/tmp/link2 "; print "$ f:", Archivo :: Spec-> rel2abs (readlink ($ f)), "\ n" ''con' perl -M'Cwd "abs_path"' -e '$ f = "/ tmp/link2 "; print "$ f:", abs_path ($ f), "\ n" '' – mivk

+0

Gracias por probar que especificar enlaces suaves sin el prefijo de ruta cuando no está en el mismo directorio va a romper cosas y es, por lo tanto, un mal que hacer ;-) – iain

+0

¿Debo señalar también que el OP solicitó la ["ruta absoluta del archivo al que apunta el enlace simbólico"] (http://stackoverflow.com/questions/4887672/how-to-get- the-absolute-path-for-symlink-file # comment-5437184) y * not * la ruta canónica (que es una ruta absoluta pero _no necesariamente_ el archivo solicitado)? – iain

-1

Todos estos mal, busque en las pruebas y de manera correcta. Ver this link

my $good = \`readlink -f $0\`; 
+4

hmm ... produciendo tráfico para su sitio? – kleopatra

+2

Solo funciona con GNU 'readlink' – twe4ked

Cuestiones relacionadas