enlace simbólico a un directorio ya existente

enlace simbólico a un directorio ya existente

¿Existe una forma adecuada de vincular /home/user/app/public, /home/user/public_htmlconsiderando el hecho de que el objetivo ya existe?

Si lo hago ln -s /home/user/app/public /home/user/public_html, termino teniendo /home/user/public_html/public.

Supongo que también sería posible invertir la acción como ln -s /home/user/public_html /home/user/app/public, sin embargo, no estoy seguro de cómo evitarlo /home/user/app/public/public_htmlcomo resultado final.

Respuesta1

Déjame entender tu problema de la manera correcta

Su fuente es /home/user/public_htmly supongo que tiene archivos allí. Y desea crear un vínculo a este directorio directamente en /home/user/app/public. De esta manera, podrías hacer algo como ls /home/user/app/publicver los archivos que existen en /home/user/public_html.

Si esto es correcto, entonces su fuente es /home/user/public_htmly el destino es /home/user/app/public. El comando correcto es este:

ln -s /home/user/public_html /home/user/app/public

Solo asegúrese de que /home/user/app/publicno sea un directorio o archivo válido antes de ingresar el comando.

Respuesta2

Si entiendo correctamente su pregunta, quería saber cómo abordar los objetivos ya existentes. Si ese es el caso, hay dos escenarios posibles.

1) el objetivo existente es un archivo. Si este es el caso, puedes forzar la creación del enlace simbólico con "-f"

2) el objetivo existente es un directorio. Si este es el caso, entonces depende de su implementación actual del comando ln. Élpodríatenga disponible el argumento "-n", lo que hace que los enlaces simbólicos a los directorios se manejen correctamente, en lugar de duplicarlos como usted dice.

Referencia:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists

Respuesta3

No voy a entrar en una discusión detallada sobre esto porque ya se seleccionó la respuesta correcta, pero lnsimplemente no funciona de esa manera.

Una solución alternativa sería utilizar mounten lugar de ln. Creo que el comando correcto en este caso sería:

sudo mount --bind ~/app/public ~/public_html

Sin embargo, tenga en cuenta la advertencia de hacerlo de esta manera: en mi experiencia, mountrequiere privilegios, por lo que tendrá que hacerlo sudo. Por esta razón no puedes ingresarlo .profileya que bloqueará tu sesión. Podrías ponerlo en un script o agregarlo a /etc/fstab. Generalmente no agrego montajes enlazados fstab, pero creo que la entrada sería:

/home/user/app/public /home/user/public_html none defaults,bind 0 0

o algo muy parecido. También estoy bastante seguro de que no puedes usar rutas relativas en fstab, por lo que las rutas deben ser absolutas, como he mostrado aquí.

Respuesta4

Como aluden @jotadepicas y @Milkmannetje en los comentarios, hay un par de formas de lidiar con esto.

Suponiendo que su origen es $sourcey su destino es $target.

  1. Retire el objetivo manualmente primero. Esto debería funcionar en Linux y Mac de forma consistente.

    rm "$target"
    ln -s "$source" "$target"
    
  2. Si estás en Linux puedes usar la -Topción.

    ln -sT "$source" "$target"
    
  3. Si estás en macOS puedes usar la -Fopción.

    ln -sF "$source" "$target"
    

información relacionada