Cómo actualizar un destino de enlace simbólico (ln -f -s no funciona)


45

Estoy usando

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

actualizar el enlace simbólico "app-current" con un nuevo destino. Sin embargo, esto no funciona, el enlace "app-current" mantiene su destino original, sin embargo, no recibo ningún error ...

Prefiero no eliminar el enlace y volver a crearlo, solo actualizar el objetivo de un enlace existente. ¿Es eso posible?

Respuestas:


55

Eso funciona para mí, ¿cuál es la salida de strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, dado que es un directorio que debe agregar -nsin desreferencia y esto debería resolver el problema. -fes realmente más conveniente ya que agregar el -f solo hace que se desvincula de todos modos. Aunque supongo que probablemente sucedería unos cientos de ms más rápido en un sistema normalmente cargado.

Por ejemplo, si arf ya apunta a / home:

strace con -n:

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

strace Sin -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

Entonces, sin que el -narf sea desreferenciado, entonces lo trata como un arf como si fuera realmente /. En su ejemplo particular, si no hay ningún error, creo que probablemente ha creado un nuevo enlace simbólico dentro /var/www/html/releases/build1390 app-currenty querrá limpiarlo.


44
genial, es el -n que lo hizo. ¡Muchas gracias!
solsol

12

Puede usar -no --no-dereferencepara evitar que el objetivo se desreferencia si es un enlace simbólico. También puede usar -To --no-target-directorypara asegurarse de que el archivo de destino siempre se tratará como un archivo normal.

Estos producen un comportamiento ligeramente diferente, como muestra el siguiente ejemplo. Supongamos que srces un archivo, dirlinkes un enlace simbólico a un directorio y dires un directorio real.

Utilizando -n:

  • ln -sfn src dirlinksobrescribe dirlinky lo vincula asrc
  • ln -sfn src dir crea enlace dir/src -> src

Utilizando -T:

  • ln -sfT src dirlinksobrescribe dirlinky lo vincula asrc
  • ln -sfT src dir produce un mensaje de error: ln: ‘dir’: cannot overwrite directory

1
tiene la respuesta más correcta y sucinta para los usuarios de Linux.
ross

¿Hay alguna forma de forzar la sobrescritura del directorio de destino para que no reciba el mensaje de error cannot overwrite directory?
gitaarik

@rednaw Puede hacer esto encadenando un par de comandos, pero en lnsí mismo no elimina los directorios; esto probablemente sería una mala idea, ya que requeriría la eliminación recursiva de una posible gran cantidad de archivos.
augurar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.