Come posso creare un collegamento simbolico relativo in Linux?


62

Ho bisogno di un collegamento simbolico che si risolva in relazione alla directory in cui si trova. Quale comando viene utilizzato per creare una cosa del genere?

Risposte:


78
  1. Vai alla directory in cui vuoi risiedere il link
  2. Esegui il comando ln -s ../some/other/file linkname

Il percorso fornito viene archiviato con il file. Quando si accede al file, il percorso memorizzato viene cercato ed espanso rispetto al file. Non sa in quale directory ti trovavi quando hai creato il link.


23
No non lo fai. Devi solo assicurarti di specificare la posizione relativa al nome del collegamento invece della directory corrente.
Ignacio Vazquez-Abrams,

5
Per facilitare la comprensione: il percorso fornito è memorizzato nel file. Quando si accede al file, il percorso memorizzato viene cercato ed espanso rispetto al file. Non sa in quale directory ti trovavi quando hai creato il link.
Marian,

2
esattamente equivalente:ln -s ../some/other/file /some/dir/linkname
visto il

1
Invece di andare giù in una directory e di nuovo in alto, puoi anche fare semplicemente ln -s ./file linknamepoiché si .riferisce alla directory corrente.
pduersteler

1
ln -s somedir/original-dir link-namenon funziona. Crea una directory con nome link-nameche contiene un collegamento non valido. Il comando che funziona èln -sr somedir/original-dir link-name
Lorenz Meyer,

28

Le versioni recenti di GNU coreutils 'ln (> = 8.16) supportano l' opzione --relative(o -r) che significa che puoi chiamare ln -scon 2 percorsi assoluti o relativi (rispetto alla tua directory di lavoro) e scoprirà il percorso relativo corretto che deve essere scritto nel link simbolico.


2
Grazie. L' -ropzione è utile quando si esegue la compilazione incrociata e sono necessari percorsi assoluti sull'host di build ma percorsi relativi sulla destinazione.
Robert Calhoun,

rdfind può produrre alcuni symlink davvero cattivi che non sono solo assoluti, ma tornano indietro dalle directory senza motivo. ln -r -s targetfile myaliaspuò aiutarti a risolverlo
Ray Foss

2

Quello che devi capire è fondamentalmente che un link simbolico è più simile a un file di testo che a una voce di directory che contiene un file. Quindi se tu

echo ../poo >/file/name

allora è abbastanza simile a

ln -s ../poo /file/name

Al sistema non importa se /file/../pooesiste, è solo un pezzo di testo che viene inserito nel collegamento simbolico. Quando qualcosa tenta di aprire il collegamento simbolico, ecco quando il sistema tenta di risolverlo.

Se stai usando una shell con il completamento del nome del file, questa funzione può confondere le cose permettendoti di completare un nome di file relativo alla tua directory di lavoro corrente, anche se poi finisci per usarlo come destinazione di un link simbolico in un'altra directory.


Questo è abusata da alcune chiamate di sistema - So ad esempio BSD utilizzato per consentire di link simbolico un particolare file system per <il cambiamento come il sistema allocata memoria. Ovviamente non esiste un file nominato <in quella directory, è solo un modo economico per creare una cosa simile a un file molto piccolo che ha alcune proprietà interessanti su un normale file di testo su quella particolare piattaforma.
triplo

Quel collegamento è ora morto. Prova man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5 ma nota anche che il comportamento nelle versioni più recenti di OpenBSD è molto meno ... colorato.
Tripleee

0

I collegamenti relativi sono stati difficili per me su OS X, vale a dire

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

entrambi non hanno funzionato (qualcosa è stato creato ma non era una directory). Ho creato il collegamento desiderato utilizzando percorsi assoluti .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

È una soluzione praticabile, quindi non deve essere un commento. Questo può rimanere come una risposta separata.
slhck,

1
Il tuo tentativo iniziale con link relativi è semplicemente sbagliato ed è per questo che non funziona. Hai frainteso come funzionano i collegamenti relativi. Non c'è nulla di particolarmente complicato (nemmeno se stai usando OS X). Forse sei stato fuorviato dalle altre risposte parlando del cambio della tua directory di lavoro quando crei il link. Questo era solo per rendere più semplice eseguire correttamente il collegamento e non è assolutamente necessario. Non si definisce il percorso relativo relativo alla directory corrente, ma alla directory del collegamento. Ecco cosa stavi cercando:ln -s Dropbox/git/codyhess/bin ~/bin
Timo,

Anche @slhck quando qualcuno chiede specificamente come creare collegamenti relativi in ​​quale mondo un detto che puoi fare collegamenti assoluti costituisce una "soluzione praticabile"? In particolare non risponde alla domanda dei PO e quindi è esattamente l'opposto della soluzione, non è una soluzione. Questo non dovrebbe essere un commento né una risposta, dovrebbe essere una domanda "Come funzionano esattamente i collegamenti relativi (spiegati in modo che gli utenti Mac lo capiscano)?". Spero che questo utente mac ora lo spieghi abbastanza bene. :)
Timo,

@TimoLehto Forse vuoi rivolgere il commento all'autore originale (Cody Hess). Ho solo copiato il post.
Slhck,

@slhck, te l'ho indirizzato a te, perché hai ritenuto la soluzione "praticabile" e il tuo commento mi ha fatto pensare che saresti la persona a convincere se si volesse contrassegnare la risposta come "non una risposta" (e ottenere il contrassegno accettato).
Timo,

0

Volevo solo spiegare ulteriormente come creare un collegamento simbolico usando percorsi relativi (con un esempio dettagliato).

Come Ignacio Vazquez-Abrams ha menzionato nei commenti, è necessario specificare la posizione del file / cartella relativa alla posizione in cui verrà creato il collegamento simbolico, non relativo alla directory corrente.

ESEMPIO

Sei in /usr/share/nginx/html/_src/learn Creerai un collegamento simbolico codingin/usr/share/nginx/html

Creare un collegamento simbolico relativo (teoria):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Crea un vero link simbolico relativo:

sudo ln -s ./_src/learn/coding ../../coding

Ulteriori informazioni (stesso esempio)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
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.