Crea un collegamento simbolico a un percorso relativo


64

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 relativo percorso e passarlo a ln?


Ma qual è il problema che sarebbe risolto con il comportamento descritto?
forcefsck

Bene, supponiamo che offri una cartella compressa da scaricare e che desideri fornire istruzioni copiabili su come collegare in modo simbolico alcuni file della cartella.
Humphrey Bogart,

2
ln -s $(pwd)/bar.txt ~/o includere uno script di installazione.
forcefsck

2
il collegamento memorizza effettivamente il nome che usi sulla riga di comando. La risoluzione di quel nome su un file viene eseguita in relazione alla posizione del collegamento. Devi usareln -s foo/bar.txt /home/beau/bar.txt
pqnet il

Risposte:


62

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 a dove lnviene eseguito.

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 -sviene 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 /).


2
Ben detto. Mi hai risposto mentre stavo scrivendo la mia risposta. :)
Shadur,

Ho appena fatto una domanda leggermente diversa, e questo risponde perfettamente. Volevo sapere come fare riferimento alla home directory in symlink in modo che funzionasse quando l'ho trasferita da un utente a un altro. Non ero sicuro che qualcosa del genere ~avrebbe funzionato.
Joe,

"quella stringa è intesa come percorso relativo alla directory principale del collegamento simbolico" - questo spiega tutto!
Bojan Komazec,

24

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

Hm, per me sembra che non ci sia tale opzione -r. Utilizzando Mac però.
Ivkremer,

1
@ivkremer sembra che questa opzione sia disponibile da coreutils> = 8.16 (fonte: superuser.com/a/837935/403979 )
DJCrashdummy

L'uso della relativa bandiera sembrava chiarire i problemi di "troppi livelli di collegamenti simbolici" che stavo vivendo.
Vix,

12

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.


7

C'è una piccola utility conveniente chiamata symlinks(originariamente da Mark Lords, ora gestita 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

Grazie. link simbolici disponibili su github . Gestito da J. Brandt Buckley. v1.4.3 .
Evgeny Vereshchagin

3

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 ciò che ln -sti dà. Penso che quello che vuoi sia:

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

1

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

Inoltre, il -sparametro significa --symbolic. lncrea 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

0

Se sei certo 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.