come aggiornare un target di collegamento simbolico (ln -f -s non funziona)


45

sto usando

ln -f -s / var / www / html / release / build1390 app-current

per aggiornare il collegamento simbolico "app-corrente" con una nuova destinazione. Tuttavia, questo non funziona, il link "app-current" mantiene la destinazione originale, tuttavia, non ottengo alcun errore ...

Preferirei non rimuovere il link e ricrearlo, basta aggiornare la destinazione di un link esistente. È possibile?

Risposte:


55

Funziona per me, qual è l'output di strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, dato che si tratta di una directory che è necessario aggiungere -nsenza alcuna dereferenza e questo dovrebbe risolvere il problema. -fè molto più utile dal momento che l'aggiunta di -f causa solo il suo scollegamento comunque. Anche se immagino che probabilmente succederebbe qualche centinaio di ms più veloce su un sistema normalmente caricato.

Ad esempio, se arf punta già a / home:

straccia con -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace senza -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Quindi, senza che l' -narf venga dereferenziato, allora lo tratta come se fosse effettivamente /. Nel tuo esempio particolare, se non ci sono errori, penso che tu abbia probabilmente creato un nuovo link simbolico all'interno di /var/www/html/releases/build1390 app-currente vorresti ripulirlo.


4
ottimo, è il -n che l'ha fatto. Molte grazie!
solsol,

12

È possibile utilizzare -no --no-dereferenceper impedire la destinazione del dereferenziamento se si tratta di un collegamento simbolico. È inoltre possibile utilizzare -To --no-target-directoryper garantire che il file di destinazione venga sempre trattato come un file normale.

Questi producono un comportamento leggermente diverso, come mostra l'esempio seguente. Supponiamo che srcsia un file, dirlinkun link simbolico a una directory ed dirè una directory reale.

Utilizzando -n:

  • ln -sfn src dirlinklo sovrascrive dirlinke lo collega asrc
  • ln -sfn src dir crea un collegamento dir/src -> src

Utilizzando -T:

  • ln -sfT src dirlinklo sovrascrive dirlinke lo collega asrc
  • ln -sfT src dir produce un messaggio di errore: ln: ‘dir’: cannot overwrite directory

1
ha la risposta più corretta e concisa per gli utenti Linux.
ross

Esiste un modo per forzare la sovrascrittura della directory di destinazione in modo da non ricevere il messaggio di errore cannot overwrite directory?
gitaarik,

@rednaw Puoi farlo concatenando un paio di comandi, ma di per lnsé non rimuove le directory - questa sarebbe probabilmente una cattiva idea, perché richiederebbe la rimozione ricorsiva di un numero forse enorme di file.
agosto
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.