Come sovrascrivere / aggiornare un collegamento simbolico?


188

Sto cercando di utilizzare i collegamenti simbolici. Ho fatto qualche lettura e ho trovato i seguenti comandi:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Le creazioni e le eliminazioni funzionano correttamente. Ma gli aggiornamenti non funzionano. Dopo aver eseguito questo comando, il collegamento simbolico non è più valido.

Ho letto qua e là che non è possibile aggiornare / sovrascrivere un collegamento simbolico. Quindi ci sono informazioni contraddittorie in rete. Chi ha ragione? Se un collegamento simbolico può essere aggiornato / ignorato, come posso raggiungere questo obiettivo?

Aggiornare

Ecco la mia struttura di directory:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Da ~/scripts/test/quando eseguo:

ln -s /remote_loc/site1 test_link

a test_linkè stato creato e posso ls -lfarlo, ma sembra rotto (contrariamente a quanto ho detto sopra nella mia domanda).

Come posso eseguire un collegamento a livello di più directory?


1
Consiglio di usare unlinkinvece di rm. Con unlinkte non rischi mai di perdere alcun file in una directory di origine utilizzando accidentalmente switch errati.
Jpsy,

Stai usando un comando / nel tuo comando
Jamie Cook

@jpsy il tuo consiglio su unlink sarebbe molto buono, se fosse vero . Prova a toccare zzzz; scollegare zzzz. (scollega le chiamate, scollega lo stesso di rm, ma senza opzioni fantasiose e senza ricorsione).
ctrl-alt-delor,

Perché usare -n? (potrebbe essere il problema). Anche se il tuo ln lo supporta, usalo -t, per questi casi e -To destination/per altri casi.
ctrl-alt-delor,

Risposte:


150

Usando -fcon lnsi sovrascriverà qualsiasi collegamento che era già lì, quindi finché hai le autorizzazioni corrette, dovrebbe funzionare ... Ha sempre funzionato per me. Quale sistema operativo stai usando?


Ho aggiornato la mia domanda con ulteriori informazioni sul mio problema.
Jérôme Verstrynge,

Sono sotto Linux.
Jérôme Verstrynge,

2
Se cambi i lnparametri, come sono incline a fare, cambierà i -ftuoi file esistenti (link target)? In entrambi i casi, abbiamo anche il -iparametro (che richiederà all'utente la sovrascrittura), se si desidera un po 'di sicurezza.
Palswim

2
@palswim Questo post SO implica che è sicuro perché -fsolo chiama unlink()e link()sotto il cofano: stackoverflow.com/a/1466570/157385 . Vorrei solo ricordare l'ordine corretto, però!
Mike Branski,

4
Non funziona. Necessità -n. Vedi risposta accettata
Shawn Welch,

119

Ok, ho scoperto dov'è il mio errore: non si dovrebbe mettere il primo /nel percorso.

In altre parole, i comandi nelle mie domande dovrebbero essere:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

invece di

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

considerando il mio caso.


22
Per alcune informazioni aggiuntive sul perché, le differenze sono una è un relativepercorso (senza il comando /) e l'altra è un absolutepercorso (con il comando /). Se stai amministrando un sistema Linux, è CRITICO capire le differenze. Ad esempio, la differenza tra rm -rf ./*e rm -rf /.*decide se mantenere il lavoro o meno :)
Safado,

5
Questo non risponde alla domanda "come aggiornare / sostituire un collegamento sym"
Sirch,

La riga ln -sfn {path / to / file-name} {link-name} lo fa.
Jérôme Verstrynge,

6
-n (--no-dereference) lo fa trattare {nome link} come un normale file piuttosto che seguire il link. Dato che è necessario operare su quel collegamento non seguirlo, è necessario utilizzare questa opzione.
feldoh,

1
Questa risposta dovrebbe essere evidenziare la risposta con il -nparametro per sostituire il collegamento del simbolo.
Nick Tsai,

12

Prima edizione:

Ti sto citando:

Le creazioni e le eliminazioni funzionano correttamente. Ma gli aggiornamenti non funzionano. Dopo aver eseguito questo comando, il collegamento simbolico non è più valido.

Il problema Con la struttura di directory indicata:

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / stuff1.txt ~ / script / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

e usando il comando:

ln -s /remote_loc/site1 test_link

È che crea un link simbolico nel tuo $ PWD, o presente directory di lavoro, che punta a un file inesistente al di fuori di /, o root, su / remote_loc / site1

Se il tuo PWD è in ~ / scripts / allora avresti dovuto usare questo:

ln -s remote_loc/site1 test_link

altrimenti avresti potuto usare l'intero percorso assoluto come:

ln -s /home/yourusername/remote_loc/site1 test_link

Secondo numero:

Ti sto citando:

Ho letto qua e là che non è possibile aggiornare / sovrascrivere un collegamento simbolico. Quindi ci sono informazioni contraddittorie in rete. Chi ha ragione? Se un collegamento simbolico può essere aggiornato / ignorato, come posso raggiungere questo obiettivo?

Per rispondere alla tua domanda "Chi ha ragione", non sono sicuro di cosa tu abbia letto esattamente o di come sia stata compresa. Tuttavia, ciò che segue dovrebbe aiutare a chiarire:

  1. Cosa può essere aggiornato e
  2. Cosa non può essere aggiornato senza utilizzare gli switch appropriati.


Aggiornamento di collegamenti simbolici con destinazioni che non sono directory.

-n -sf:
-f o --force rimuovono i file di destinazione esistenti, vengono utilizzati per aggiornare la destinazione o la destinazione di un collegamento.

Esempio:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Ma, come puoi vedere, fornirà il percorso assoluto se i percorsi assoluti sono negli lnargomenti di. È necessario fornire un percorso completo quando la directory di lavoro corrente è diversa dalla directory principale del collegamento.


Percorsi relativi:

-nfr:
il -r o --relativo crea collegamenti simbolici relativi alla posizione del collegamento.

Esempio:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Tuttavia, l'aggiornamento di un collegamento a una directory non funzionerà se la destinazione è una directory.

Esempio:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Come puoi vedere, nonostante utilizzi nomi di percorso assoluti indicati lnnell'argomento precedente senza l'opzione -r, il collegamento simbolico è ancora relativo al collegamento.


Aggiorna collegamenti alle directory:

ln -sfrn:
-n o --no-dereference tratta LINK_NAME come un normale file se si tratta di un collegamento simbolico a una directory.

Esempio:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

In contrasto con:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

Quando eseguo i test con 1 livello di directory, funziona, ma sto cercando di utilizzare directory multilivello e non funziona. Ho aggiornato la mia domanda.
Jérôme Verstrynge,
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.