it-swarm.it

Crea un collegamento simbolico a un percorso relativo

Posso farlo:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Ma vorrei poterlo fare:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

È possibile? Posso in qualche modo risolvere il percorso relativo e passarlo a ln?

65
Humphrey Bogart

Se crei un collegamento simbolico a un percorso relativo, lo memorizzerà come un collegamento simbolico relativo, non assoluto come mostra il tuo esempio. Questa è generalmente una buona cosa. I collegamenti simbolici assoluti non funzionano quando il filesystem è montato altrove.

Il motivo per cui il tuo esempio non funziona è che è relativo alla directory principale del collegamento simbolico e non dove viene eseguito ln.

Tu puoi fare:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

O per quello che conta:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

È importante rendersi conto che il primo argomento dopo ln -s è memorizzato come destinazione del collegamento simbolico. Può essere qualsiasi stringa arbitraria (con le uniche restrizioni che non può essere vuota e non può contenere il carattere NUL), ma nel momento in cui il collegamento simbolico viene utilizzato e risolto, tale stringa viene intesa come percorso relativo al directory principale del collegamento simbolico (quando non inizia con /).

66
penguin359

Se usi coreutils più recenti (sto usando coreutils-8.22-11), ha un'opzione per farlo:

ln --help | grep relative

può contenere testo arbitrario; se successivamente risolto, un collegamento relativo è -r, --relative crea collegamenti simbolici relativi alla posizione del collegamento

Per esempio:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
25
ptr

Scusa no. I collegamenti simbolici sono relativi alla posizione in cui si trova il collegamento, non alla posizione in cui ti trovavi quando hai creato il collegamento. Esistono diverse buone ragioni per questo comportamento, la maggior parte delle quali comporta il montaggio di filesystem remoti.

12
Shadur

C'è una piccola utility conveniente chiamata symlinks (originariamente di Mark Lords, ora gestito da J. Brandt Buckley), presente in molte distribuzioni Linux.

Per convertire tutti i collegamenti simbolici assoluti in una directory in modo che siano relativi:

symlinks -c /path/to/directory

Sfortunatamente non c'è alcuna opzione per convertire un singolo link, dovresti prima spostarlo nella sua directory.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

Puoi provare:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Ma crea un collegamento simbolico al percorso assoluto. La tua domanda testuale fa menzione del relativo percorso ...

Normalmente, un percorso relativo è ciò che vuoi e cosa ln -s ti dà. Penso che quello che vuoi sia:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

Poiché le shell più comuni espandono i percorsi, per creare un collegamento simbolico relativo è necessario citare il "percorso di origine".

Anche il -s parametro significa --symbolic. ln crea collegamenti fissi per impostazione predefinita.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

Se sei sicuro che non ci sia alcuna possibilità che i tuoi punti di mount cambino, puoi ottenere ciò che stai cercando di fare in una Shell bash come questa:

ln -s `pwd`/bar.txt ~/bar.txt

Ciò presuppone che ci si trovi nella directory di destinazione quando si effettua il collegamento simbolico.

0
mreff555