2011-12-22 11 views
6

Wow, non ho mai usato i collegamenti simbolici che molto prima, ma questo è davvero incredibile:I link simbolici non funzionano quando il collegamento viene effettuato in un'altra directory?

bash-3.2$ echo "weird" > original.txt 
bash-3.2$ mkdir originals 
bash-3.2$ mv original.txt originals/ 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ mkdir copies 
bash-3.2$ ln -s originals/original.txt copies/copy.txt 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ ls copies/copy.txt 
copies/copy.txt 
bash-3.2$ ls -l copies/copy.txt 
lrwxr-xr-x 1 zach staff 22 Dec 22 01:23 copies/copy.txt -> originals/original.txt 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ cd copies/ 
bash-3.2$ cat copy.txt 
cat: copy.txt: No such file or directory 

Perché non posso gatto il link simbolico nella directory le copie?

Se creo il link simbolico dall'interno delle copie /, posso farlo bene. Se creo il link simbolico nella directory corrente, posso anche farlo bene. Se creo il collegamento simbolico nella directory corrente e lo sposto in copie /, viene visualizzato "copy/copy.txt: No such file or directory".

risposta

15

Se si crea un percorso relativo a un collegamento simbolico, lo memorizzerà come relativo collegamento simbolico. I collegamenti simbolici sono relativi alla posizione in cui si trova il collegamento, non alla posizione in cui è stato creato o aperto.


Utilizzare il percorso o il percorso assoluto relativo al collegamento.

Cambio:

ln -s originals/original.txt copies/copy.txt 

A:

# absolute 
ln -s /path/to/originals/original.txt copies/copy.txt 

# relative 
cd copies 
ln -s ../originals/original.txt copy.txt 
+0

Non è necessario utilizzare un percorso assoluto. Finché si prefigura il percorso con un punto (che significa 'percorso corrente della directory') si dovrebbe essere bravi. – adamwong246

5

È inoltre possibile utilizzare percorso relativo per raggiungere questo obiettivo. come

cd copies 
ln -s ../originals/original.txt copy.txt 

Ciò funzionerà

quando si apre il link simbolico, che si cerca di fare riferimento al file dalla directory copie e dal momento che non esiste si stanno ottenendo quell'errore.

Quando si utilizza il percorso relativo o assoluto, questo problema verrà risolto.

+0

Quando si scrive uno script che crea collegamenti simbolici, esiste un modo per specificare da quale directory deve essere creato un percorso relativo? – user225643

+0

Con lo script dovresti andare per il percorso assoluto.Avere una directory fissa per contenere collegamenti simbolici e quindi creare i collegamenti relativi a qualsiasi file nella directory – Raghuram

+0

Tutti i collegamenti simbolici relativi sono relativi alla directory in cui si trova il collegamento. Non è necessario che un collegamento faccia riferimento a un file esistente una volta creato (come hai trovato). La scelta del collegamento relativo o assoluto NON dovrebbe essere fatta su difficoltà di fare il collegamento ma se vuoi un collegamento relativo o assoluto. Ricorda che lo spostamento di un collegamento relativo dopo la sua creazione modifica il percorso assoluto del file a cui punta. Vedere qui per la conversione: http://stackoverflow.com/questions/2564634/bash-convert-absolute-path-into-relative-path-given-a-current-directory –

1

Si consideri un esempio in cui si desidera collegare in modo simbolico i registri delle applicazioni in un'altra posizione che potrebbe essere una directory montata su una directory secondaria la cui dimensione non influirà sul funzionamento del server. Ora la directory montata sarà indirizzata a te e dovresti creare un link simbolico a questa directory per la directory dei tuoi registri.

Supponiamo che la directory dell'applicazione sia/home/ubuntu/my_app e una volta avviata l'applicazione genererà una directory di registro all'interno della directory my_app. Ora l'obiettivo finale è di deviare il carico di utilizzo del disco nella directory montata e attualmente non abbiamo la nostra directory di registro presente nella nostra directory app. Quindi, basta andare avanti e seguire le istruzioni riportate di seguito:

mkdir /path_to_mounted_directory/log 
ln -s /path_to_mounted_directory/log /home/ubuntu/my_app_log 

Questo sarà per prima cosa creare una directory chiamata di registro nella sezione montata e sarà mappare i registri delle applicazioni per questa directory. Qualsiasi file aggiunto nella cartella del registro dell'applicazione verrà collegato automaticamente alla directory montata e quindi potrai leggerli da qualsiasi luogo, sia dalla directory dei registri originali che dalla cartella montata.

Problemi correlati