2011-02-03 23 views
5

# test-> a.plcome ottenere il percorso assoluto per il file symlink?

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

come ottenere il percorso assoluto per il file link simbolico?

+0

Stai dicendo che desidera che il percorso assoluto del collegamento simbolico o il percorso assoluto del file il link simbolico punta a? – iain

+0

percorso assoluto del file il collegamento simbolico punta a – Tree

+0

Quindi in realtà vuoi solo sapere come ottenere il percorso assoluto per un dato pathname, perché sai già come usare 'readlink()' per ottenere un percorso verso il puntatore file. –

risposta

10

Cwd fornisce tale funzionalità per 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

Attenzione, probabilmente andrà male quando i nomi file UTF-8 sono in uso. In tal caso qualcosa come 'Encode :: decode_utf8 (Cwd :: abs_path ($ file));' potrebbe essere necessario! –

3

se si utilizza File :: Spec rel2abs con readlink si otterrà il percorso addominali, anche se si tratta di un link simbolico ad un altro link simbolico

use File::Spec; 

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

File :: Spec rel2abs non sembra funzionare con più collegamenti. Abs_path di Cwd funziona. Prova 'touch/tmp/target; ln -s target/tmp/link1; ln -s link1/tmp/link2' e confronta 'perl -MFile :: Spec -e '$ f ="/tmp/link2 "; stampa "$ f:", File :: Spec-> rel2abs (readlink ($ f)), "\ n" ''con' perl -M'Cwd "abs_path"' -e '$ f = "/ tmp/link2 "; stampa "$ f:", abs_path ($ f), "\ n" '' – mivk

+0

Grazie per aver provato che specificare i soft link senza il prefisso del percorso quando non si è nella stessa directory si romperà le cose ed è, quindi, un brutto cosa da fare ;-) – iain

+0

Devo anche precisare che l'OP ha richiesto il ["percorso assoluto del file il collegamento simbolico punta a"] (http://stackoverflow.com/questions/4887672/how-to-get- the-absolute-path-for-symlink-file # comment-5437184) e * not * il percorso canonico (che è un percorso assoluto ma _na necessariamente_ il file richiesto)? – iain

-1

Questi tutti sbagliati, guarda su test e nel modo giusto. Si veda this link

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

hmm ... producendo traffico per il tuo sito? – kleopatra

+2

Funziona solo con GNU 'readlink' – twe4ked

Problemi correlati