2011-03-09 12 views
37

he creado un enlace simbólico:no puede sobrescribir enlace simbólico RedHat Linux

sudo ln -s /some/dir new_dir 

Ahora desea sobrescribir el enlace simbólico para apuntar a una nueva ubicación y no se sobreponen. He tratado:

sudo ln -f -s /other/dir new_dir 

siempre puedo sudo rm new_dir, pero yo preferiría tener que sobrescribir en consecuencia si es posible. ¿Algunas ideas?

Respuesta

60
ln -sfn /other/dir new_dir 

trabaja para mí. El -n no desreferencia el enlace simbólico de destino.

+1

Buen punto. Desde la página man: '-h Si el target_file o target_dir es un enlace simbólico, no lo sigas. Esto es más útil con la opción -f, para reemplazar un enlace simbólico que puede apuntar a un directorio. – redent84

+1

'-n' es equivalente a' -h' (al menos en MacOS X) – redent84

9

Puede crearlo y luego moverlo:

sudo ln -f -s /other/dir __new_dir 
sudo mv -Tf __new_dir new_dir 

edición: Falta -TF, para tratar el directorio como un archivo normal y no pedirá sobreescritura.

De esta manera lo sobreescribirá.

1

ya que el vínculo de comentario mikeytown2s está roto, voy a explicar por qué redent84s answer es mejor:

Mientras

ln -sfn newDir currentDir 

hace el trabajo, no es una operación atómica, como se puede ver con strace:

$ strace ln -snf newDir currentDir 2>&1 | grep link 
unlink("currentDir")   = 0 
symlink("newDir", "currentDir") = 0 

Esto es importante cuando tienes una raíz del servidor web que apunta a ese enlace simbólico. Podría causar errores mientras el enlace simbólico se elimina y se crea nuevamente, incluso en el intervalo de tiempo de un microsegundo.

Para evitar errores utilizan en su lugar:

$ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir 

Esto creará un enlace temporal y después de eso sobrescribir currentDir en una operación atómica.

Cuestiones relacionadas