Creare un collegamento simbolico relativo alla directory corrente


110

Sto cercando di creare un collegamento simbolico nella mia home directory che punti a una directory sul mio HDD esterno.

Funziona bene quando lo specifico in questo modo:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Tuttavia crea un collegamento difettoso quando provo questo:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Questo crea un link in cui non posso cdentrare.

Quando provo, bash si lamenta:

bash: cd: Data: Too many levels of symbolic links

Anche il collegamento simbolico Dati a casa mia è colorato in rosso quando lsè impostato per visualizzare l'output colorato.

Perché sta succedendo? Come posso creare un collegamento in quel modo? (Voglio creare un collegamento simbolico a una directory nella mia directory di lavoro in un'altra directory.)


Modifica: secondo questa risposta StackOverflow, se il secondo argomento (nel mio caso sarebbe ~ / Data) esiste già ed è una directory, lncreerà un collegamento simbolico alla destinazione all'interno di quella directory.

Tuttavia, sto riscontrando lo stesso problema con:

ln -s Data/ ~/

7
Solo un suggerimento casuale: di cd ~solito è lo stesso di cd.

3
ls -l ~/Datati avrebbe aiutato a vedere cosa non andava nel link "rosso".
msw,

Hm, non sapevo che avrei potuto farlo, grazie. Ricordo di cat
averci

Nota a margine, supponiamo che tu voglia creare solo un link simbolico di tutti i file, dir e subdir all'interno di una particolare cartella, diciamo, tutti gli elementi all'interno /run/media/name/exhdd/Data/per Datausare quindi il seguenteln -s /run/media/name/exhdd/Data/* Data
user2555595

Risposte:


115

Ecco cosa sta succedendo. Se si crea un collegamento simbolico con un percorso relativo, il collegamento simbolico sarà relativo. I collegamenti simbolici memorizzano semplicemente i percorsi che gli dai. Non risolvono mai percorsi per percorsi completi. In esecuzione

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

crea un collegamento simbolico denominato ls2in (vale /usr/bina lsdire. /usr/bin/ls) relativo alla directory in cui si trova il collegamento simbolico ( /usr/bin). Il comando sopra creerebbe un collegamento simbolico funzionale da qualsiasi directory.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Se il collegamento simbolico viene spostato in un'altra directory, smetterebbe di puntare al file su /usr/bin/ls.

Stai creando un collegamento simbolico che punta Datae lo assegni un nome Data. Sta indicando se stesso. Devi creare un collegamento simbolico con il percorso assoluto della directory.

ln -s "$(realpath Data)" ~/Data

14

Avevo lo stesso problema. Google ha portato a questa risposta ma la soluzione più semplice non è documentata qui:

ln -sT 

-T fa il trucco

amico ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Basta aggiungere questo qui in modo che chiunque abbia la stessa domanda possa trovarlo :)


9

lnIl comportamento con percorsi relativi non è intuitivo. Per ripristinare la sanità mentale, utilizzare la -rbandiera.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Spiegazione:

   -r, --relative
          create symbolic links relative to link location

Ciò significa che lnfarà ciò che ti aspetti. Prenderà in considerazione in quale directory ci si trova, in quale directory si trova la destinazione e costruirà un percorso relativo alla directory in cui si troverà il collegamento. Il comportamento predefinito (senza -r) è interpretare letteralmente il primo parametro (destinazione) , in in tal caso devi costruire tu stesso il percorso in modo che sia valido nella directory del link.

In alternativa, utilizzare un percorso assoluto, come indicato da @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

o

ln -s "(realpath Data)" ~/Data #fish shell

-1

Molto semplicemente puoi creare un link per una cartella. Guarda il mio comando

ln -s / home / targatedfolder / var / www / html / link_name

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.